doutui8842 2014-10-20 14:02
浏览 20
已采纳

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

I have the following code to extract parameter name and value from string, here it is : (yes, regex has to be this long, it has other purposes)

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

which returns this:

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

And it works fine.The problem is that I can also have strings with parameter values escaped, something like this:

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

So I had to modify the regex, adding "\?" to allow one backalash before the quotes, and it looks something like this:

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

So I tried this new regex in a few online testers, and all of them returned correct result. However, preg_match_all returns this:

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

So why this second regex doesn't work as expected, but it works in online testing tools?

  • 写回答

1条回答 默认 最新

  • douli4337 2014-10-20 14:17
    关注

    Without trying to rewrite your expression, to match a literal backslash you must use four backslashes:

    \\\\?
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系