1

好的,假设我正在尝试解析:

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

这不起作用:

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

但这确实:

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

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

4

2 回答 2

5

贪心选择器

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

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

由于您使用“任何字符”(.),因此它一直匹配到">输入字符串中最后一次出现该字符为止。

非贪心选择器

如果您使选择器不贪婪,那么它将在最短的匹配中停止:

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

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

u您还可以使用修饰符使所有选择器默认为非贪婪:

preg_match('/href="http:\/\/(.+)">/u', $a, $b);
于 2013-02-08T09:37:40.310 回答
0

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

 preg_match("#href=[\"|']([^\"]*)[\"|']#",' '.$a.' ',$b);
于 2013-02-08T09:34:57.480 回答