【问题标题】:Regex in PHP not workingPHP中的正则表达式不起作用
【发布时间】:2013-04-25 19:44:00
【问题描述】:

我的正则表达式是:

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

我的内容包括:

Q: Email Address 
A: name@example.com

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

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

如果我删除 (?

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

发生了什么事?

我还使用了具有不同内容的特定类型的正则表达式(即 (?

【问题讨论】:

  • 您使用哪些函数来解析正则表达式? preg_, eregi_?
  • @phpisuber01 preg_match().
  • 你的正则表达式中的A带有某种变音符号,内容中的A是一个普通的字母。
  • @Barmar 我的浏览器中没有显示变音符号...它看起来像一个A 字符。
  • @AbsoluteƵERØ 这实际上不是变音符号。当我并排看这些字母时,这个字母更高。当我将它粘贴到 Emacs 中时,它说它有代码 #x51371。

标签: php regex


【解决方案1】:

您不太可能在这里不使用 DOTALL 标志 s,这将使 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
        )

)

【讨论】:

    【解决方案2】:

    这是我更新的用于验证电子邮件是否“验证”的怪物脚本。您可以喂它奇怪的东西并破坏它,但在生产中它可以处理我遇到的 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. 我的 email@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
    )
    

    【讨论】:

    • 这与A:lookbehind 的问题有什么关系?
    • @Barmar 我明白了。抱歉耽搁了……我只写 160wpm。
    【解决方案3】:

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

    我将正则表达式更改为:

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

    它有效。

    【讨论】:

    • 你一定是在开玩笑吧.. 花了一个小时试图找出问题所在,最后我想找一个希腊语的“A”,而我​​想要一个英文的.. .
    【解决方案4】:

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

    【讨论】:

    • 是的,我看到了正确提取 RFC 电子邮件地址所需的正则表达式怪物!
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-19
      • 2014-02-04
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多