我目前正在尝试从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
答案 0 :(得分:3)
您可以使用此模式:
$pattern = '~\[url(?|=[\'"]?([^]"\']+)[\'"]?]([^[]+)|](([^[]+)))\[/url]~';
$replacement = '<a href="$1">$2</a>';
$result = preg_replace($pattern, $replacement, $subject);
这个想法是使用分支重置功能保留交替的每个分支的组编号。这样,组1始终包含URL,组2包含链接描述。如果没有描述,则使用url,这就是为什么url被两次封闭在第二个分支的捕获组中。
答案 1 :(得分:0)
试试这个,它会起作用
<?php
$urlsearch = "(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?";
$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 );
?>