2014-10-20 62 views
-1

我有下面的代码来提取字符串参数名称和值,那就是: (是的,正则表达式必须是此长,它有其他目的)正则表达式工作在在线测试仪,但不与preg_match_all

$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] =>)) 

那么,为什么预期本次的正则表达式是不行的,但它在网络测试工具的工作原理?

+0

我认为这个问题是只能用引号。 – 2014-10-20 14:06:28

回答

1

没有试图重写你的表达,以配合您必须使用四个反斜杠反斜杠:

\\\\? 
+0

是的,就是这样,谢谢! – Zed 2014-10-20 14:20:10

相关问题