【问题标题】:URL-BBCode RegexURL-BBCode 正则表达式
【发布时间】:2013-07-04 16:27:54
【问题描述】:

我目前正在尝试从 BBCode 获取 URL。有四种可能,这是我目前的问题:

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

两个都需要。这就是我目前所拥有的:

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

但这仅适用于案例 1 和 2。

编辑:

这样效果更好:

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

但仍然不完美。

编辑:

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

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

regexp-tester

【问题讨论】:

标签: php regex bbcode


【解决方案1】:

你可以使用这个模式:

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

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

这个想法是使用分支重置功能保留交替的每个分支的组编号。这样,第 1 组始终包含 url,第 2 组始终包含链接描述。当没有描述时,就使用 url,这就是为什么 url 被两次包含在第二个分支的捕获组中。

【讨论】:

    【解决方案2】:

    试试这个,它会起作用的

    <?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 );
    ?>
    

    【讨论】:

    • 看起来对我的情况来说有点过分了;)无论如何,Ty。
    • 尝试一些复杂的 url ;)
    • 问题不在于 URL。我只需要 BBCode 的内容,它也可以是非 url(这就是我只使用 .* 的原因)。