0

Hello everyone i have a problem I have a text

$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 ";

i need to transform all text links http/s exept domains somelink3.org,somelink2.com they must be plain text

Something like this but with domains filter and not extention images:

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

edit: this helped me :

$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);  
4

2 回答 2

1

对于这种情况,您可以使用(?!...)否定的前瞻断言。只需(?!somelink3.org|somelink2.com)在协议占位符之后立即添加://

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

另外,您不应该将笨拙的方法与第二步preg_match_all结合使用。str_replace而是利用preg_replace_callback并将所有逻辑放在一个函数中。

于 2012-05-16T01:07:59.787 回答
0

您可能可以将其浓缩并使用 preg replace all

原始正则表达式

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

原始替换

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

修饰符 //xsg

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

于 2012-05-16T01:45:14.357 回答