0

我的正则表达式是:

$regex = '/(?<=Α: )(([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4}))/';

我的内容包括:

Q: Email Address 
A: name@example.com

Rad Software 正则表达式设计器说它应该可以工作。

各种在线站点返回正确的结果。

如果我删除 (?<=Α: ) 后视,正则表达式会正确返回所有电子邮件。

当我从 php 运行它时,它不返回任何匹配项。

这是怎么回事?

我还使用了具有不同内容的特定类型的正则表达式(即 (?<=Email: )。在这种情况下它工作得很好。

4

5 回答 5

1

这是我用于验证电子邮件是否“验证”的较新的怪物脚本。你可以喂它奇怪的东西并破坏它,但在生产中它可以处理我遇到的 99.99999999% 的问题。真正来自拼写错误的误报更多。

<?php

$pattern = '!^[^@\s]+@[^.@\s]+\.[^@\s]+$!';

$examples = array(
  'email@email.com',
  'my.email@email.com',
  'e.mail.more@email.co.uk',
  'bad.email@..email.com',
  'bad.email@google',
  '@google.com',
  'my@email@my.com',
  'my email@my.com',
);


foreach($examples as $test_mail){
    if(preg_match($pattern,$test_mail)){
      echo ("$test_mail - passes\n");   
    } else {
      echo ("$test_mail - fails\n");                
    }
}

?>

输出

  1. email@email.com - 通行证
  2. my.email@email.com - 通行证
  3. e.mail.more@email.co.uk - 通行证
  4. bad.email@..email.com - 失败
  5. bad.email@google - 失败
  6. @google.com - 失败
  7. my@email@my.com - 失败
  8. 我的电子邮件@my.com - 失败

除非有后视的原因,否则您可以使用 preg_match_all() 匹配字符串中的所有电子邮件。由于您使用的是字符串,因此您需要稍微修改正则表达式:

$string_only_pattern = '!\s([^@\s]+@[^.@\s]+\.[^@\s]+)\s!s';

$mystring = '
email@email.com - passes
my.email@email.com - passes
e.mail.more@email.co.uk - passes
bad.email@..email.com - fails
bad.email@google - fails
@google.com - fails
my@email@my.com - fails
my email@my.com - fails
';

preg_match_all($string_only_pattern,$mystring,$matches);

print_r ($matches[1]);

仅从字符串输出

Array
(
    [0] => email@email.com
    [1] => my.email@email.com
    [2] => e.mail.more@email.co.uk
    [3] => email@my.com
)
于 2013-04-25T20:05:58.640 回答
1

您不太可能s在这里不使用 DOTALL 标志,这将使 DOT 在您的正则表达式中也匹配换行符:

$str = <<< EOF
Q: Email Address 
A: name@example.com
EOF;
if (preg_match_all('/(?<=A: )(([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4}))/s', 
                   $str, $arr))
   print_r($arr);

输出:

Array
(
    [0] => Array
        (
            [0] => name@example.com
        )

    [1] => Array
        (
            [0] => name@example.com
        )

    [2] => Array
        (
            [0] => name
        )

    [3] => Array
        (
            [0] => example.
        )

    [4] => Array
        (
            [0] => com
        )

)
于 2013-04-25T20:06:35.413 回答
0

在您的正则表达式问题本身之外,您真的应该考虑不要尝试编写自己的电子邮件地址正则表达式解析器。请参阅 stackoverflow 帖子:使用正则表达式验证电子邮件地址的原因 - 结果:RFC 很长并且对您的正则表达式能力要求很高。

于 2013-04-25T19:47:46.473 回答
0

问题是你的正则表达式 contains Α,它有一个重音,但内容 contains A,它没有。所以后面的内容不匹配。

我将正则表达式更改为:

$regex = '/(?<=A: )(([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4}))/';

它有效。

于 2013-04-25T20:12:33.457 回答
0

您主题中的 A 字符是代码为 65(unicode 或 ascii)的“普通”字符。但是您在模式后面使用的 A 具有代码 913 (unicode)。它们看起来相似但又不同。

于 2013-04-25T20:39:52.817 回答