我有下面的代码来提取字符串参数名称和值,那就是: (是的,正则表达式必须是此长,它有其他目的)正则表达式工作在在线测试仪,但不与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] =>))
那么,为什么预期本次的正则表达式是不行的,但它在网络测试工具的工作原理?
我认为这个问题是只能用引号。 – 2014-10-20 14:06:28