0

みなさん、こんにちは。問題があります。テキストがあります。

$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 ex​​ept domain 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);  
4

2 に答える 2

1

(?!...)このような場合は、ネガティブ先読みアサーションを使用できます。(?!somelink3.org|somelink2.com)プロトコルプレースホルダーの直後に追加するだけです://

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

また、二次的なステップとしてpreg_match_all不器用なものと組み合わせて使用​​するべきではありませんstr_replace。代わりpreg_replace_callbackに、すべてのロジックを利用して1つの関数にまとめます。

于 2012-05-16T01:07:59.787 に答える
0

あなたはおそらくそれを凝縮して、すべてを置き換えるpregを使用することができます

生の正規表現

(?: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 に答える