You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
}

规则说明

  1. 带参数的URL格式:
    正则#\[url="(.*?)"\](.*?)\[/url\]#is里的两个(.*?)是非贪婪捕获,分别抓取出链接地址和显示文本;i表示不区分大小写(支持[URL]大写标签),s让.能匹配换行符(避免标签跨行时失效)。替换时用$1和$2对应捕获的内容就行。

  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 08:43:11