为什么我的RegEx只有在包含一些额外字符时才会结束?

时间:2013-02-08 09:32:57

标签: php regex parsing preg-match

好吧,让我说我正在尝试解析这个问题:

href="http://google.com">Website</a>

这不起作用:

preg_match('/href="http:\/\/(.+)">/', $a, $b);

但这样做:

preg_match('/href="http:\/\/(.+)">Website/', $a, $b);

这是为什么?第一个只是继续到字符串的末尾。

2 个答案:

答案 0 :(得分:5)

贪婪选择器

这里的问题是你的选择器是贪婪的 - 它会匹配它可能的最长字符串:

preg_match('/href="http:\/\/(.+)">/', $a, $b);

由于您使用“任何字符”(.),因此它会在输入字符串中最后一次出现的">之前进行匹配。

无贪婪选择器

如果你使选择器非贪婪,那么它将在最短的匹配时停止:

preg_match('/href="http:\/\/(.+?)">/', $a, $b);

注意正则表达式模式中的额外?,它将“一个或多个”(+)运算符修改为无贪心。

默认情况下,您也可以使用u modifier使所有选择器都非贪婪:

preg_match('/href="http:\/\/(.+)">/u', $a, $b);

答案 1 :(得分:0)

这是我用它测试的最好的href解析器

 preg_match("#href=[\"|']([^\"]*)[\"|']#",' '.$a.' ',$b);