2013-07-06 161 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