PHP中的正则表达式不起作用

PHP中的正则表达式不起作用,php,regex,Php,Regex,我的正则表达式是: $ReXEX=/(?< p>您的正则表达式本身之外,您应该真正考虑不要尝试编写您自己的电子邮件地址正则表达式解析器。参见StasObjultPoST:为什么?):RFC是长的,对正则表达式能力要求很高。 < P>这是我更新的一个验证电子邮件是否“验证”的怪物脚本。或者不是。你可以给它输入奇怪的东西并打破它,但在生产中,这可以处理我遇到的99.99999999%的问题。更多的误报是由打字错误造成的 <?php $pattern = '!^[^@\s]+@[^.@\s

我的正则表达式是:


<代码> $ReXEX=/(?< p>您的正则表达式本身之外,您应该真正考虑不要尝试编写您自己的电子邮件地址正则表达式解析器。参见StasObjultPoST:为什么?):RFC是长的,对正则表达式能力要求很高。

< P>这是我更新的一个验证电子邮件是否“验证”的怪物脚本。或者不是。你可以给它输入奇怪的东西并打破它,但在生产中,这可以处理我遇到的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");                
    }
}

?>
仅从字符串输出

Array
(
    [0] => email@email.com
    [1] => my.email@email.com
    [2] => e.mail.more@email.co.uk
    [3] => email@my.com
)

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

$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);

问题是正则表达式包含带有重音的
Α
,但内容包含不带重音的
A
。因此查找不匹配

我将正则表达式更改为:

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

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

您使用哪些函数来解析regex?preg_uu,eregi_u?@phpisuberpreg_u匹配()。正则表达式中的
A
上有某种变音符号,内容中的
A
是一个普通字母。@Barmar变音符号在我的浏览器中不显示……它看起来像一个
A
字符。@AbsoluteƵERØ它实际上不是变音符号。当我并排看这些字母时,这一个就是taller、 当我将它粘贴到Emacs中时,它说它有代码#x51371。是的,我看到了一个需要正确提取RFC电子邮件地址的正则表达式的怪物!这与问题有什么关系,问题是关于
a:
lookback?@Barmar我正要开始。抱歉耽搁了……我只写160wpm。你一定在开玩笑吧……一个小时我花了很多时间试图找出问题所在,最后我想找一个希腊字母“a”,而我想要一个英语字母。。。
$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
        )

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