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

Joh*_*ith 1 php regex parsing preg-match

好的,我想说我正在尝试解析这个问题:

href="http://google.com">Website</a>
Run Code Online (Sandbox Code Playgroud)

这不起作用:

preg_match('/href="http:\/\/(.+)">/', $a, $b);
Run Code Online (Sandbox Code Playgroud)

但这样做:

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

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

AD7*_*six 5

贪婪的选择器

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

preg_match('/href="http:\/\/(.+)">/', $a, $b);
Run Code Online (Sandbox Code Playgroud)

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

非贪婪的选择器

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

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

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

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

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