Preg_replace文本链接到域过滤器

时间:2012-05-16 00:43:52

标签: php regex

大家好,我有问题 我有一个文字

$text = " some and text http://www.somelink2.com/html5.jpg and some text http://www.somelink.net/test/testjava/html5.html#fbid=QTb-X6fv5p1 some http://www.somelink4.org test and http://www.somelink3.org/link.html text and some text ";

我需要转换所有文本链接http / s exept域somelink3.org,somelink2.com它们必须是纯文本

这样的东西,但有域过滤器而不是扩展图像:

function livelinked ($text){
        preg_match_all("#((http|https|ftp)://(\S*?\.\S*?))(\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)|^(jpg)^#ie", $text, $ccs);
        foreach ($ccs[3] as $cc) {
           if (strpos($cc,"jpg")==false  && strpos($cc,"gif")==false && strpos($cc,"png")==false ) {
              $old[] = "http://".$cc;
              $new[] = '<a href="http://'.$cc.'" target="_blank">'.$cc.'</a>';
           }
        }
        return str_replace($old,$new,$text);
}

编辑:这对我有所帮助:

$text =  preg_replace("~((?:http|https|ftp)://(?!site.com|site2.com|site3.com)(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)~i",'<a href="$1" target="_blank">$1</a>',$text);  

2 个答案:

答案 0 :(得分:1)

您可以使用(?!...) negative lookahead assertion来处理此类情况。只需在协议占位符(?!somelink3.org|somelink2.com)之后立即添加://

 #((http|https|ftp)://(?!domain1|domain2)(\S*?\.\S*?))....

此外,您不应将preg_match_all与笨拙的str_replace结合使用作为辅助步骤。而是使用preg_replace_callback并将所有逻辑放在一个函数中。

答案 1 :(得分:0)

您可以将其压缩并使用preg替换所有

Raw Regex

(?:http|https|ftp)://
(\S*?\.(?:(?!(?<=\.)(?:jpg|png|gif)|\s).)*?)
(?= [\s;)\]\[{},"':<] | $ | \.\s )

原始替代

<a href="http://$1" target="_blank">$1</a>

修饰符// xsg

编辑: - 所以我没有发现你需要过滤域名。上面的正则表达式过滤jpg / png / gif文件,这是相当复杂的。但是使用url解析器或回调中的其他正则表达式可以更好地处理添加过滤器。