Php 使用正则表达式从多行中获取分离的数据

Php 使用正则表达式从多行中获取分离的数据,php,regex,Php,Regex,我有以下数据行: City: London Email: main@email.com Name: Mr.Test Emails: email1@mail.com email2@mail.com invalid-email-too 使用此代码: if(preg_match('/\nEmails: (.*).\n/s', $query, $matches)) { return $matches[1]; } 我得到如下字符串结果: email1@mail.com

我有以下数据行:

City:  London
Email:  main@email.com

Name:    Mr.Test
Emails:  email1@mail.com
      email2@mail.com
invalid-email-too
使用此代码:

if(preg_match('/\nEmails: (.*).\n/s', $query, $matches)) {
    return $matches[1];
}
我得到如下字符串结果:

email1@mail.com
          email2@mail.com
但我需要它,因为它已经作为数组分离了。 然后是使用“Email:”和“Email:”获得数组结果的最佳解决方案。 如何使用一个正则表达式?您可以使用

'~(?:\G(?!\A)|^Emails:)\s*\K\S+@\S+\.\S+~m'

详细信息

  • (?:\G(?!\A)| Emails:)
    -
    Emails:
    在行的开头(
    ^Emails:
    ,请注意,
    m
    修饰符使
    ^
    匹配字符串的开头和所有行的起始位置)或上一个匹配的结尾(
    \G(?!\A)
  • \s*
    -0+空格
  • \K
    -匹配重置操作符丢弃所有匹配的文本,直到整个匹配缓冲区
  • \S+@\S+\.\S+
    -类似电子邮件的模式:1+非空白、
    @
    、1+非空白、
    和1+非空白
:


这里有一个简单的方法,但它似乎很好地工作,至少对您的示例数据是这样。它只在可能出现的电子邮件地址之后出现:

$input = "City:  London\nEmail:  main@email.com\n\nName:    Mr.Test\nEmails:  email1@mail.com\n      email2@mail.com";
preg_match_all ("/\b\w+@[^.]+\.\w+\b/U", $input, $array);
print_r($array[0]);

Array
(
    [0] => main@email.com
    [1] => email1@mail.com
    [2] => email2@mail.com
)


这种方法会出错的地方是,如果文本中出现的电子邮件地址不是以
电子邮件:
标题开头的。在这种情况下,这个答案会给出错误的匹配。

@D.Schaller是的,但是我们现在有没有任何数据表明电子邮件地址可能出现在其他任何地方?如果可以的话,我更喜欢一个简单的解决方案。如果没有@或点的电子邮件格式错误,那么它就不起作用了。它必须返回所有电子邮件。有效或错误。@step您能展示一些坏邮件的例子吗?请注意,很难猜测要使用什么模式。即使是现有的电子邮件正则表达式也适用于有效的电子邮件,而不是无效的。
$input = "City:  London\nEmail:  main@email.com\n\nName:    Mr.Test\nEmails:  email1@mail.com\n      email2@mail.com";
preg_match_all ("/\b\w+@[^.]+\.\w+\b/U", $input, $array);
print_r($array[0]);

Array
(
    [0] => main@email.com
    [1] => email1@mail.com
    [2] => email2@mail.com
)