php regex preg_match-在第一个分隔符后停止


php regex preg_match - stop after first delimiter

我有一个文本,里面有很多单词和链接。我想在里面找到一个特定的链接。我目前使用:

preg_match('/http:'/'/www'.myserver'.com'/.*'.(rar|zip|tar|gz)/',$text,$result)

现在让我们假设我有这样的文本:

bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla <a href="http://www.myserver.com/test.zip">http://www.myserver.com/somefile.zip</a> bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla

预期的结果是:

http://www.myserver.com/test.zip

但脚本将返回:

http://www.myserver.com/test.zip">http://www.myserver.com/somefile.zip

我想我需要告诉它在到达第一个".zip"后停止,但是。。。怎样

问题是默认情况下preg_match贪婪。这意味着它将尽可能多地匹配字符串。

如果你在量词中添加一个?,它将使其不贪婪,意思是"在下一个模式开始的地方停止"

preg_match('/http:'/'/www'.myserver'.com'/.*?'.(rar|zip|tar|gz)/',$text,$result);
//                                      ----^

另请参阅:

  • php preg_match非贪婪
  • http://www.regular-expressions.info/repeat.html