一个智能正则表达式,用于在HTML中转换链接(来自BBCODE而不是)


an intelligent regex to convert links (from bbcode and not) in html

我正在尝试创建自己的函数,用于将一些链接字符串从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]作为输出。