当字符串中存在多个匹配时,模式仅匹配一次

时间:2013-06-23 05:00:34

标签: regex

我正在尝试匹配网址标记中包含的图片网址,如下所示

[URL=http://www.google.com/sdaasd/sadasda/asddsa/sadsa/dasd.html][IMG]http://www.cnn.com/asd.jpg[/IMG][/URL] 

我有以下模式,只有匹配一个URL / IMG组合的单个实例才能完美运行

\[URL=("|)([\s\S]*?)("|)]\[img\](https?:\/\/.*\.(?:png|jpg))\[\/img]\[\/URL\]

但是,如果我按如下方式重复URL / IMAGE组合:

[URL=http://www.google.com/sdaasd/sadasda/asddsa/sadsa/dasd.html][IMG]http://www.cnn.com/asd.jpg[/IMG][/URL] [URL=http://www.google.com/sdaasd/sadasda/asddsa/sadsa/dasd.html][IMG]http://www.cnn.com/asd.jpg[/IMG][/URL]

然后它不再有效。关于变通方法/修复的任何想法??

3 个答案:

答案 0 :(得分:1)

我猜您需要修改.*以使用non-greedy quantifier.*?,如下所示:

\[URL=("|)([\s\S]*?)("|)]\[img\](https?:\/\/.*?\.(?:png|jpg))\[\/img]\[\/URL\]

答案 1 :(得分:1)

您的.*尽可能匹配,包括][IMG]。您可以通过排除][^]]*

来避免这种情况

答案 2 :(得分:1)

你可以做的快速修复是使用惰性量词而不是贪心量词。换句话说,将.*替换为.*?

您可以使用更有效的模式来避免延迟量词,例如:

$pattern ='~\[URL=([^]]*+)]\[IMG]([^[]*+)\[/IMG]\[/URL]~';