URL-BBCode正则表达式

时间:2013-07-06 23:33:21

标签: php regex bbcode

我目前正在尝试从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

2 个答案:

答案 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.,@?^=%&amp;:\/~+#-]*[\w@?^=%&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 );
?>