正则表达式 bbcode 和来自字符串的超链接

regex bbcode and hyperlink from string

[url=http://whosebug.com]Whosebug[/url]
[url=http://whosebug.com]http://whosebug.com[/url]
http://whosebug.com
[url=http://whosebug.com][img]url_to_img[/img][/url]
[url=http://whosebug.com][b]Whosebug[/b][/url]
[url=http://whosebug.com][b][u][i]Whosebug[/i][/u][/b][/url]
[url=http://whosebug.com][color=red]Whosebug[/color][/url]
[url=http://whosebug.com][h1][color=red]Whosebug[/color][/h1][/url]

改成这样:

<a href="http://whosebug.com">Whosebug</a>
<a href="http://whosebug.com">http://whosebug.com</a>
<a href="http://whosebug.com">http://whosebug.com</a>
<a href="http://whosebug.com"><img src="url_to_img" /></a>
<a href="http://whosebug.com"><strong>Whosebug</strong></a>
<a href="http://whosebug.com"><span style="color:red">Whosebug</span></a>
<a href="http://whosebug.com"><h1><span style="color:red">Whosebug</span></h1></a>

我试着找到一些东西来替换所有不是 bbcode url。
我尝试使用 https://github.com/wookieb/bbcode 但是当我将 php 5.2 升级到 5.5 时停止工作。
我尝试使用 http://jbbcode.com/ 但没有从字符串中解析 url。

除了一根线,我已经重建了所有线,只有 url.

<?php
$input = "[url=http://whosebug.com]Whosebug[/url]
[url=http://whosebug.com]http://whosebug.com/damn[/url]
http://whosebug.com/ok
[url=http://whosebug.com][img]url_to_img[/img][/url]
[url=http://whosebug.com][b]Whosebug[/b][/url]
[url=http://whosebug.com][b][u][i]Whosebug[/i][/u][/b][/url]
[url=http://whosebug.com][color=red]Whosebug[/color][/url]
[url=http://whosebug.com][h1][color=red]Whosebug[/color][/h1][/url]";

$match = [
    '/\[url=([^\]]+)\](.*)\[\/url\]/im',
    '/\[img\](.*)\[\/img\]/im',
    '/\[b\](.*)\[\/b\]/im',
    '/\[u\](.*)\[\/u\]/im',
    '/\[i\](.*)\[\/i\]/im',
    '/\[color=([^\]]+)\](.*)\[\/color\]/im',
    '/\[h([1-6])\](.*)\[\/h(?:[1-6])\]/im',
];
$replace = [
    '<a href=""></a>',
    '<img src="">',
    '<strong></strong>',
    '<u></u>',
    '<em></em>',
    '<span style="color:;"></span>',
    '<h></h>',
];

echo preg_replace($match, $replace, $input);

这给出了以下输出:

<a href="http://whosebug.com">Whosebug</a>
<a href="http://whosebug.com">http://whosebug.com/damn</a>
http://whosebug.com/ok
<a href="http://whosebug.com"><img src="url_to_img"></a>
<a href="http://whosebug.com"><strong>Whosebug</strong></a>
<a href="http://whosebug.com"><strong><u><em>Whosebug</em></u></strong></a>
<a href="http://whosebug.com"><span style="color:red;">Whosebug</span></a>
<a href="http://whosebug.com"><h1><span style="color:red;">Whosebug</span></h1></a>

只匹配 url 的那个有点棘手。这取决于你想要它有多先进。它可能会检测到像 example.com 这样的简单内容或像 ☃.net 这样的更高级的内容(结果是 http://xn--n3h.net/

一些解释
我们尝试匹配和替换的第一条规则是 url 代码。我们从搜索 [url= 的外观开始,简单且硬编码。我们接下来要寻找的东西可能有很多,但我们可以肯定的是,我们必须以 ] 结尾。然后我们可以使用正则表达式来表示: match all but ] ([^\]]+) 请注意,我转义了 ] 字符,否则匹配将失败。
接下来我再次搜索所有内容 ((.*)),直到我们达到硬编码的预期值 [/url].
这几乎是您想要的每种 bbcode 类型的完整匹配规则。

至于替换部分你把应该替换的内容包括进去,很简单。要添加在正则表达式中匹配的值,请使用 , , ..., $n。匹配由我的括号定义。
例如:'/[url=([^]]+)](.*)[/url]/我'
粗体的两个括号段是包含我们将从 </code> 和 <code>

获得的值的段

我尽力解释这是如何工作的。如果还有不明白的地方,请指出,我会尽力解释