正则表达式 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>
获得的值的段
我尽力解释这是如何工作的。如果还有不明白的地方,请指出,我会尽力解释
[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>
我尽力解释这是如何工作的。如果还有不明白的地方,请指出,我会尽力解释