0

リンクを含む文字列があります。URL に応じて、リンクを使用して php にさまざまなことをさせたいと考えています。

答え:

function fixLinks($text)
{       
        $links = array();
        $text = strip_tags($text);    
        $pattern = '!(https?://[^\s]+)!'; 
        if (preg_match_all($pattern, $text, $matches)) {
            list(, $links) = ($matches);
        }

        $i = 0;
        $links2 = array();
        foreach($links AS $link) {
            if(strpos($link,'youtube.com') !== false) {
                $search = "!(http://.*youtube\.com.*v=)?([a-zA-Z0-9_-]{11})(&.*)?!";
                $youtube = '<a href="youtube.php?id=\\2" class="fancy">http://www.youtube.com/watch?v=\\2</a>';
                $link2 = preg_replace($search, $youtube, $link);
            } else {
                $link2 = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\-\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank"><u>$1</u></a>', $link);
            }
            $links2[$i] = $link2;
            $i++;     
        }
        $text = str_replace($links, $links2, $text);
        $text = nl2br($text);

    return $text;
}
4

2 に答える 2

2

まずは溝eregi。これは非推奨であり、すぐになくなります。

次に、これを 1 回のパスで行うのは、やり過ぎかもしれません。これを3段階に分けたほうがいいと思います。

フェーズ 1では、入力に対して正規表現検索を実行し、リンクのように見えるものをすべて見つけて、リストに格納します。

フェーズ 2では、リストを繰り返し処理し、リンクが youtube に移動するかどうかを確認し (parse_urlこれには非常に便利です)、適切な置換を 2 番目のリストに入れます。

フェーズ 3 : 2 つのリストができました。1 つは元の一致を含み、もう 1 つは目的の置換を含みます。元のテキストに対して str_replace を実行し、検索パラメーターの一致リストと置換の置換リストを提供します。

このアプローチにはいくつかの利点があります。

  1. リンクを抽出するための正規表現は、特別なホスト名を考慮する必要がないため、比較的単純に保つことができます。
  2. デバッグが容易です。フェーズ 3 の前に配列の検索と置換をダンプして、期待どおりのものが含まれているかどうかを確認できます。
  3. 一度にすべての置換を実行するため、重複する一致や、既に置換されたテキストの一部を置換する問題を回避できます (結局のところ、置換されたテキストにはまだ URL が含まれているため、再度置換する必要はありません)。
于 2011-10-25T18:44:18.887 に答える
0

tdammers の答えは良いですが、別のオプションは を使用することpreg_replace_callbackです。あなたがそれで行くなら、プロセスは少し変わります:

  1. フェーズ 1 と同じように、すべてのリンクに一致する正規表現を作成します。
  2. コールバックで、YouTube ビデオ ID を検索します。これには 2 番目の を実行する必要がありpreg_match、これが (私の意見では) この手法の最大の問題です。
  3. YouTube かどうかに基づいて、置換文字列を返します。

コードは次のようになります。

function replaceem($matches) {
    $url = $matches[0];
    preg_match('~youtube\.com.*v=([\w\-]{11})~', $url, $matches);
    return isset($matches[0]) ?
        '<a href="youtube.php?id='.$matches[1].'" class="fancy">'.
        'http://www.youtube.com/watch?v='.$matches[1].'</a>' :
        '<a href="'.$url.'" title="Åben link" alt="Åben link" '.
        'target="_blank">'.$url.'</a>';
}
$text = preg_replace_callback('~(?:f|ht)tps?://[^\s]+~', 'replaceem', $text);
于 2011-10-25T19:01:08.747 に答える