2017-02-22 28 views
0

Учитывая следующие примеры, я хочу, чтобы получить адрес электронной почтыRegex - получить группу 1 как «полное совпадение»/группа 0

Eg. 1: some standard text. Bugs Bunny [email protected] 0411111111 more standard text 
Eg. 2: some standard text. Bugs The Bunny [email protected] 0411111111 more standard text 
Eg. 3: some standard text. Bugs-Bunny [email protected] 0411111111 more standard text 
Eg. 4: some standard text. Bugs bugs.bun[email protected] +6141 111 111 more standard text 
Eg. 5: some standard text. Bugs o'Bunny [email protected] 0411111111 more standard text 

Это сделать: (?<=some standard text. )(?:.*?)([^\s][email protected][^\s]+)https://regex101.com/r/A29hjE/9

но адрес электронной почты находится в группе 1. Мне нужно, чтобы это была группа 0 или полное совпадение, потому что это регулярное выражение будет создаваться динамически с помощью некоторого кода, в котором все остальные регулярные выражения выдают свои результаты как полное совпадение.

Я не знаю достаточно о группах, но я знаю, что мне нужен первый адрес электронной почты после разряда some standard text., и, как я уже сказал, это должен быть полный матч.

ответ

0

Если вы измените свое регулярное выражение просто ([^ \ s] + @ [^ \ s] +), то полный результат должен быть только адресом электронной почты.

+0

Я понимаю, что в примерах но мне нужен первый адрес электронной почты после «некоторого стандартного текста», так как в полном тексте есть адрес электронной почты. – Warren

+0

В принципе, вы просите согласовать «некоторый стандартный текст», но затем не отображаете это в полном результате. Я не считаю, что это возможно. – dimab0

+0

Я боялся этого ... – Warren

0

Группа 0 полный матч.

Если вы измените свое регулярное выражение только на [^\s][email protected][^\s]+, оно будет соответствовать адресу электронной почты во всех ваших примерах. https://regex101.com/r/SQL9Ul/1

Из-за различной длины имени вы не можете использовать положительный lookbehind и соответствовать адресу электронной почты в целом.

0

Вы можете сделать:

$lines = array(
"some standard text. Bugs Bunny [email protected] 0411111111 more standard text ", 
"some standard text. Bugs The Bunny [email protected] 0411111111 more standard text", 
"some standard text. Bugs-Bunny [email protected] 0411111111 more standard text", 
"some standard text. Bugs [email protected] +6141 111 111 more standard text", 
"some standard text. Bugs o'Bunny [email protected] 0411111111 more standard text ", 
); 
foreach($lines as $line) { 
    preg_match('/some standard text..+?\K\[email protected]\S+/', $line, $m); 
    var_dump($m); 
} 

где:

  • \K значит забыть все, что мы не встречались, пока здесь.
  • \S обозначает любой NON пробельных, это то же самое, что [^\s]

Тогда мы имеем только электронную почту в $m[0]

Выход:

array(1) { 
    [0]=> 
    string(14) "[email protected]" 
} 
array(1) { 
    [0]=> 
    string(14) "[email protected]" 
} 
array(1) { 
    [0]=> 
    string(20) "[email protected]" 
} 
array(1) { 
    [0]=> 
    string(20) "[email protected]" 
} 
array(1) { 
    [0]=> 
    string(14) "[email protected]" 
}