PHP-BBCode解析器-解析bbcode链接标记和未标记链接

2022-03-22 00:00:00 regex php preg-replace bbcode

我需要执行此操作:

当用户使用preg_place和regex插入BBCode标记时,我会执行一些转换。

例如

function forumBBCode($str){
   $format_search=array(
      '#[url=(.*?)](.*?)[/url]#i'
   );

   $format_replace=array(
      '<a class="lforum" target="_blank" href="$1">$2</a>'
   );

   $str=preg_replace($format_search, $format_replace, $str);
   $str=nl2br($str);
   return $str;
}
现在我还想要这样:当用户插入带有链接的普通文本时,这也必须转换。我不能执行此TMERED PRIG_REPLACE函数,因为如果我将代码编写为

$format_search
'#(www..*?)#i'

$format_replace
'<a class="lforum" target="_blank" href="$1">$1</a>'

它将转换链接2次(在[url]中,并且当链接没有此标记时)。

所以我觉得这个功能:

    function checkLinks($string) {
    $arrelab="";
    $arr=split(' |
', $string);
    for($i=0; $i<sizeof($arr); $i++) {
        echo $i." - ".$arr[$i]."<br/>";
        if ((strpos($arr[$i], 'www.')!==false) or (strpos($arr[$i], 'http://')!==false) or (strpos($arr[$i], 'ftp://')!==false)) {
            if (strpos($arr[$i], '[url=')===false) {
                $arr[$i]='<a class="lforum" target="_blank" href="'.$arr[$i].'">'.$arr[$i].'</a>';
            }
        }

        $arrelab=$arrelab." ".$arr[$i];
    }
    return $arrelab;
}

问题是我需要拆分换行符和空格。 如有任何帮助,我们将不胜感激。

附注:很抱歉我的英语不好:)

干杯


解决方案

使用回溯断言很容易解决问题。

preg_replace('#(?<![>/"])((http://)?www.........)#im', '<a href="$1">$1</a>'
因此,正则表达式将跳过用"或&>;括起来或前面有/的任何URL 这是解决办法,不是解决方案。

ps:target="_Blank"是用户纠缠。别说了。

相关文章