0

我正在尝试匹配包含在 URL 标记中的图像 URL,如下所示

[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]

然后它不再起作用。关于解决方法/修复的任何想法?

4

3 回答 3

1

A quick fix that you can do is to use a lazy quantifier instead of a greedy quantifier. In other words replace .* by .*?

You can use a more efficient pattern that avoid the lazy quantifier, example:

$pattern ='~\[URL=([^]]*+)]\[IMG]([^[]*+)\[/IMG]\[/URL]~';
于 2013-06-23T05:12:08.477 回答
1

我的猜测是您需要修改.*以使用非贪婪量词, .*?,如下所示:

\[URL=("|)([\s\S]*?)("|)]\[img\](https?:\/\/.*?\.(?:png|jpg))\[\/img]\[\/URL\]
于 2013-06-23T05:03:56.977 回答
1

.*正在尽可能匹配,包括][IMG]. 您可以通过排除以下内容来避免这种情况][^]]*

于 2013-06-23T05:05:11.847 回答