我有以下代码从字符串中提取参数名称和值,这里是: (是的,正则表达式必须这么长,它有其他用途)
$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 :(得分:1)
如果不尝试重写表达式,要匹配文字反斜杠,必须使用四个反斜杠:
\\\\?