使用preg_replace将UBB/phpBB格式的URL标记转换为HTML的实现问题
使用preg_replace将UBB/phpBB格式的URL标记转换为HTML的实现问题
嘿,我完全懂你现在的困扰——已经搞定了粗体、斜体和下划线的UBB转HTML,偏偏卡在URL标签上对吧?别慌,我来帮你把两种URL格式的转换规则补上,直接整合到你的现有函数里就行。
首先,先明确你提到的两种UBB URL格式:
- 无参数版:
[url]www.example.com[/url]→ 转成带http协议的HTML链接,显示文本可以是原内容或者简化后的域名 - 带参数版:
[url="https://www.example.com"]Example Site[/url]→ 转成指定链接地址和显示文本的HTML链接
整合后的完整函数
function convertFromUBB($articleBody){ // 已有的粗体、斜体、下划线转换 $articleBody = preg_replace( '#\[b\](.+?)\[/b\]#is', '<b>\1</b>', $articleBody ); $articleBody = preg_replace( '#\[u\](.+?)\[/u\]#is', '<u>\1</u>', $articleBody ); $articleBody = preg_replace( '#\[i\](.+?)\[/i\]#is', '<i>\1</i>', $articleBody ); // 处理带指定链接地址的UBB格式:[url="链接"]显示文本[/url] $articleBody = preg_replace( '#\[url="(.*?)"\](.*?)\[/url\]#is', '<a href="$1">$2</a>', $articleBody ); // 处理无参数的UBB格式:[url]链接文本[/url] // 基础版:链接地址和显示文本完全一致,自动补全http协议 $articleBody = preg_replace( '#\[url\]((?:https?://)?)(.*?)\[/url\]#is', function($matches) { // 如果原文本没带http/https协议,自动补上 $protocol = $matches[1] ?: 'http://'; $fullUrl = $protocol . $matches[2]; // 显示文本用原内容,如果你想简化成去掉协议和www的域名,就用下面这行替换$matches[2] // $displayText = preg_replace('#^(?:https?://)?(?:www\.)?#', '', $matches[2]); return "<a href=\"$fullUrl\">$matches[2]</a>"; }, $articleBody ); return $articleBody; }
规则说明
带参数的URL格式:
正则#\[url="(.*?)"\](.*?)\[/url\]#is里的两个(.*?)是非贪婪捕获,分别抓取出链接地址和显示文本;i表示不区分大小写(支持[URL]大写标签),s让.能匹配换行符(避免标签跨行时失效)。替换时用$1和$2对应捕获的内容就行。无参数的URL格式:
我用了匿名函数来处理,这样能更灵活地处理协议补全和显示文本的调整:- 先判断原文本是否带
http://或https://,没有的话自动补上; - 如果想实现你例子里“显示去掉www的域名”的效果,只需要把
$matches[2]换成注释里的$displayText就行。
- 先判断原文本是否带
测试示例
比如你输入:
[url]www.example.com[/url] [url="https://blog.example.com"]我的博客[/url]
转换后会得到:
<a href="http://www.example.com">www.example.com</a> <a href="https://blog.example.com">我的博客</a>
要是你想调整显示文本的格式,比如去掉www,只需要启用注释里的$displayText那行,第一个示例就会变成<a href="http://www.example.com">example.com</a>,完全符合你给出的例子效果~
备注:内容来源于stack exchange,提问作者bobafart
相关产品推荐
相关产品推荐

