2013-07-06 210 views
2

我目前正試圖從BBCode獲取一個URL。有它四種可能性,這就是我目前的問題:URL-BBCode正則表達式

[url]http://stackoverflow.com/[/url] 
[url='http://stackoverflow.com/']http://stackoverflow.com/[/url] 
[url="http://stackoverflow.com/"]http://stackoverflow.com/[/url] 
[url=http://stackoverflow.com/]http://stackoverflow.com/[/url] 

我兩者都需要。這是,我至今:

/\[url(?:\=\'([^\'"]+)\')?](.+?)\[\/url]/i 

但這只是個案工作1 & 2.

編輯:

這工作得更好:

/\[url(?:\=(?:[\"|'])?(.*)(?:[^[]+)?)?\](.*)\[\/url\]/i 

但仍不完美。

編輯:

我想,我明白了。這可能需要一些優化,但它似乎工作:

/\[url(?:\=("|\'|)?(.*)?\1)?\](.*)\[\/url\]/i 

regexp-tester

+0

[REGEX for bbcode links + non-bbcode URLs]的可能重複(http://stackoverflow.com/questions/17151716/regex-for-bbcode-links-non-bbcode-urls) – PeeHaa

+0

不完全,但接近 – user2557188

回答

3

您可以使用此模式:

$pattern = '~\[url(?|=[\'"]?([^]"\']+)[\'"]?]([^[]+)|](([^[]+)))\[/url]~'; 
$replacement = '<a href="$1">$2</a>'; 

$result = preg_replace($pattern, $replacement, $subject); 

這個想法是使用分支來保留交替的每個分支的組編號重置功能。這樣,組1中總是包含url和組2中的鏈接描述。當沒有描述時,網址就會被使用,這就是爲什麼url被兩次包含在第二個分支的捕獲組中的原因。

+0

完美的作品。謝謝。 – user2557188

0

試試這個,它會工作

<?php 
    $urlsearch = "(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\[email protected]?^=%&amp;\/~+#-])?"; 
    $text = preg_replace("/\[url\]($urlsearch)\[\/url\]/", "<a href=\"$1\">$1</a>", $text); 
    $text = preg_replace("(\[url\=[\"']?($urlsearch)[\"']?\](.+?)\[/url\])", "<a href=\"$1\">$5</a>", $text); 

    print_r($text); 
?> 
+0

看到我上面的編輯。 – user2557188

+0

@ user2557188​​是的,我知道了,代碼更新,現在檢查 – bystwn22

+0

看起來像是對我的案件矯枉過正;)Ty反正。 – user2557188