好的,假设我正在尝试解析:
href="http://google.com">Website</a>
这不起作用:
preg_match('/href="http:\/\/(.+)">/', $a, $b);
但这确实:
preg_match('/href="http:\/\/(.+)">Website/', $a, $b);
为什么是这样?第一个只是一直到字符串的末尾。
好的,假设我正在尝试解析:
href="http://google.com">Website</a>
这不起作用:
preg_match('/href="http:\/\/(.+)">/', $a, $b);
但这确实:
preg_match('/href="http:\/\/(.+)">Website/', $a, $b);
为什么是这样?第一个只是一直到字符串的末尾。
这里的问题是你的选择器是贪婪的 - 它会匹配它可以匹配的最长的字符串:
preg_match('/href="http:\/\/(.+)">/', $a, $b);
由于您使用“任何字符”(.
),因此它一直匹配到">
输入字符串中最后一次出现该字符为止。
如果您使选择器不贪婪,那么它将在最短的匹配中停止:
preg_match('/href="http:\/\/(.+?)">/', $a, $b);
请注意正则表达式模式中的额外?
内容,它将“一个或多个” ( +
) 运算符修改为非贪婪的。
u
您还可以使用修饰符使所有选择器默认为非贪婪:
preg_match('/href="http:\/\/(.+)">/u', $a, $b);
这是我用来测试它的最好的 href 解析器
preg_match("#href=[\"|']([^\"]*)[\"|']#",' '.$a.' ',$b);