Regex适用于在线测试,但不适用于preg_match_all

时间:2014-10-20 14:02:20

标签: php regex

我有以下代码从字符串中提取参数名称和值,这里是: (是的,正则表达式必须这么长,它有其他用途)

    $sample = 'href="http://google.com/"';
    $reg = "#([a-zA-Z\-\/]+)\s*(?:=\s*(?:\"([^\">]*)\"?|'([^'>]*)'?|([^'\"\s]*)))?#S";
    preg_match_all($reg, $sample, $m);
    $result = print_r($m, true);
    echo $result;

返回:

Array ( [0] => Array ( [0] => href="http://google.com/ )
        [1] => Array ( [0] => href )
        [2] => Array ( [0] => http://google.com/ ) 
        [3] => Array ( [0] => )
        [4] => Array ( [0] => ) )

它工作正常。问题是我也可以使用参数值转义的字符串,如下所示:

$sample = 'href="\http://google.com/\"';

所以我不得不修改正则表达式,添加" \?"在引号之前允许一个backalash,它看起来像这样:

$sample = 'href="http://google.com/"';
$reg = "#([a-zA-Z\-\/]+)\s*(?:=\s*(?:\\?\"([^\">]*)\"?|'([^'>]*)'?|([^'\"\s]*)))?#S";
preg_match_all($reg, $sample, $m);
$out = print_r($m, true);
echo $out;

所以我在一些在线测试人员中尝试了这个新的正则表达式,所有这些都返回了正确的结果。但是,preg_match_all会返回:

 Array ( [0] =>
          Array ( [0] => href= 
                  [1] => http 
                  [2] => //google [3] => com/ ) 
         [1] => Array ( 
                  [0] => href 
                  [1] => http 
                  [2] => //google
                  [3] => com/ ) 
          [2] => Array ( 
                  [0] => 
                  [1] => 
                  [2] =>
                  [3] => ) 
         [3] => Array ( 
                 [0] => 
                 [1] => 
                 [2] => 
                 [3] => ) 
         [4] => Array (
                 [0] => 
                 [1] => 
                 [2] => 
                 [3] => ) )

那么为什么这第二个正则表达式没有按预期工作,但它适用于在线测试工具?

1 个答案:

答案 0 :(得分:1)

如果不尝试重写表达式,要匹配文字反斜杠,必须使用四个反斜杠:

\\\\?