我正在尝试创建自己的函数,用于将一些链接字符串从bbcode(和普通字符串)转换为正确的html。
目前我有这个:
$format_search=array(
'#[url=(((http|https|ftp)://)[a-zA-Z0-9-_./?=&;#]+)](.*?)[/url]#i'
'#(?<![>/"])(((http|https|ftp)://)[a-zA-Z0-9-_./?=&;#]+)#im',
);
$format_replace=array(
'<a class="lforum" href="$1">$4</a>',
'<a class="lforum" href="$1">$1</a>',
);
$str=preg_replace($format_search, $format_replace, $str);
它或多或少:)
将bbcode捕获为[url=link]link_name[/url]不是问题。问题是当我尝试捕获网站上的每种链接时。(例如,当用户插入没有任何 BBcode 的 http://link.com 时)。
例如 [b]http://links[/b] 不起作用...还有许多其他场景需要考虑!
我不知道如何在没有冲突的情况下创建一个好的功能!我的意思是:首先将搜索链接字符串的字符串解析为 bbcode;比,解析其余的,也许没有替换以前的。
你有什么建议吗?
不是用这种方法。(?<![>/"])
是阻止它工作的原因。该断言的目的是防止双重链接<a>http://example.com</a>
。但它也阻止了<b>http://example.com
上的比赛。
一种解决方法是更改输出链接:
'<a href="$1" class="lforum">$4</a>',
这将允许在否定断言中使用 class=:
(?<![/"]|class="lforum">)http..
因此,它仍然匹配<a>
链接以外的标签。
另一种方法是在将BBcode
转换为HTML之前将原始文本URL预转换为BBcode。为此使用您现有的 URL 正则表达式并为其添加前缀,例如 (?<![]=])
并使用[url=$1]$1[/url]
作为输出。