2013-04-25 133 views
0

我的正则表达式是:正则表达式在PHP不工作

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

我等内容是:

Q: Email Address 
A: [email protected] 

拉德软件正则表达式设计师说,它应该工作。

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

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

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

发生了什么事?

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

+1

你使用哪些函数来解析正则表达式? preg_ *,eregi_ *? – phpisuber01 2013-04-25 19:45:46

+0

@ phpisuber01 preg_match()。 – jimmy 2013-04-25 19:52:17

+0

正则表达式中的“A”有一些变音符号,内容中的“A”是普通字母。 – Barmar 2013-04-25 20:00:54

回答

0

的问题是,你的正则表达式中包含Α,其中有超过它的口音,但内容包含A,这没有。所以lookbehind不匹配。

我改变正则表达式:

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

和它的作品。

+0

你一定是在跟我开玩笑...... 花了一个小时,试图找出什么是错的,最后我想找一个希腊语'A',当我想要一个英语的时候...... – jimmy 2013-04-25 20:20:56

0

您正则表达式的问题本身之外,你真的应该考虑的问题。不要试图编写自己的电子邮件地址正则表达式解析器。请参阅stackoverflow post:Using a regular expression to validate an email address为什么 - upshot:RFC是长期的,并且要求您的正则表达式能力。

+0

是的,我已经看到正确提取RFC电子邮件地址所需的正则表达式的怪物! – jimmy 2013-04-25 19:50:57

1

这是我的较新的怪物脚本,用于验证e邮件“验证”或没有,你可以喂它奇怪的东西,并打破它,但在生产过程中,它处理了我遇到的99.99999999%的问题。操作系统。

<?php 

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

$examples = array(
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '@google.com', 
    '[email protected]@my.com', 
    'my [email protected]', 
); 


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

?> 

输出

  1. [email protected] - 传递
  2. [email protected] - 传递
  3. [email protected] - 通过
  4. bad.email @ .. email.com - 失败
  5. [email protected] - 失败
  6. @ google.com - 失败
  7. 我@电子邮件@ my.com - 失败
  8. [email protected] - 失败

除非有针对的理由向后看,你可以匹配preg_match_all()中的所有电子邮件。既然你有一个字符串的工作,你会稍微修改小幅正则表达式:

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

$mystring = ' 
[email protected] - passes 
[email protected] - passes 
[email protected] - passes 
[email protected] - fails 
[email protected] - fails 
@google.com - fails 
[email protected]@my.com - fails 
my [email protected] - fails 
'; 

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

print_r ($matches[1]); 

从字符串只

Array 
(
    [0] => [email protected] 
    [1] => [email protected] 
    [2] => [email protected] 
    [3] => [email protected] 
) 
+0

这与这个问题有什么关系,这个问题是关于“A:”后视? – Barmar 2013-04-25 20:07:05

+0

@Barmar我正在接近它。对不起,我只写了160wpm。 – 2013-04-25 20:22:31

1

输出你是不是最有可能不使用DOTALL标志s这里这将让DOT匹配换行符在你的正则表达式:

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

OUTPUT:

Array 
(
    [0] => Array 
     (
      [0] => [email protected] 
     ) 

    [1] => Array 
     (
      [0] => [email protected] 
     ) 

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

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

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

) 
0

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