2013-06-23 96 views
0

我想如下模式只匹配了一次,當多個匹配字符串中

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

匹配其封閉在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] 

然後它不再起作用。有關解決方法/修復的任何想法?

+2

什麼語言是您使用? –

+1

而'(「|)'雖然是合法的,但它是我見過的更令人困惑的片段之一,你希望這意味着什麼? – msw

回答

1

我的猜測是,你需要修改.*使用non-greedy quantifier.*?,像這樣:

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

.*是匹配儘可能多的,包括][IMG]。你可以通過排除]來避免這種情況:[^]]*

1

你可以做的一個快速修復就是使用一個懶惰的量詞而不是一個貪婪的量詞。換句話說更換.*通過.*?

您可以使用避免懶惰量詞,比如更有效的模式:

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