2010-07-09 65 views
1

我需要这样做:PHP - BB代码分析器 - 解析都设置高亮的链接标签,而不是标签链接

当用户插入一个BBCode的标签,用了preg_replace和正则表达式我做了一些改造中。

例如

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

现在我想也是这样的:当用户用链接插入普通文本时,这也必须被转换。我不能做到这一点trought了preg_replace功能,因为如果我写了代码

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

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

它会转换链接2时(在[URL],当链路没有这个标签)。

,所以我觉得这个功能:

function checkLinks($string) { 
    $arrelab=""; 
    $arr=split(' |\r\n', $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; 
} 

的问题是,我需要一个分裂为新行,作为空的空间。 任何帮助,将不胜感激。

p.s.对不起,我的英语不好:)

欢呼

回答

2

很容易与向后断言要解决。

preg_replace('#(?<![>/"])((http://)?www.........)#im', '<a href="$1">$1</a>' 

因此,正则表达式将跳过括在“或>或通过/
这是一个解决方案,而不是解决方案

PS preceeded:目标=”任何URL。_空白”是用户的纠缠切它。出

+0

呃,我不明白你是什么意思,完全与该代码。 如果我有一个文本不包含“或>表达式不评估? 应该是不错的正则表达式不评估”http://“文本,如果它有字符串[url =,但我不能做到这一点... – markzzz 2010-07-09 19:52:40

+0

这个正则表达式的作用是确保url已经不在链接中了,在* ['url ='regex。 – 2010-07-09 19:55:05

+0

好吧,现在我明白他的意思了: )不错的一个,它似乎是不错的:) ps1。如果我想要“所有字符允许”后www这应该是好的没有?www \ ..?* 但它似乎是错... ps2。如果我想要http和ftp?我写(?:http | //)而不是(http://)? – markzzz 2010-07-09 20:02:51

1

你的问题可以通过阅读你的标题来标识.. 结合解析正则表达式

你不能“解析” HTML或BB使用正则表达式编码,因为它们不是常规语言。

您应该编写(或查找)bb代码解析器,而不是使用正则表达式。

谷歌的第一个BB代码解析器结果是NBBC: The New BBCode Parser。但我从来没有用过它,所以我不能评论质量。

2

最简单的选择是先解析纯文本的URL,并确保它们不会在等号后立即出现。从马里奥斯

更新:

preg_replace('#(?<![>/"])(((http|https|ftp)://)?www[a-zA-Z0-9\-_\.]+)#im', '<a href="$1">$1</a>'

+0

我已经尝试过这一点,但它不工作(它切开之后WWW的链接。)... – markzzz 2010-07-09 20:13:13

+0

我有固定的非贪婪的选项。 – 2010-07-09 20:24:12

+0

是的,它岩石!说实话,我不明白为什么它的工作原理,但我会学习它作为锻炼正则表达式! TNN再次给你和马里奥:) – markzzz 2010-07-09 20:26:41