2011-10-25 3 views
0

私はリンクを含む文字列を持っています。私は私のリンクで、URLに応じてさまざまなことをするために私のPHPをします。PHPで文字列のリンクを検索します。通常とYouTubeのリンクとの違い

回答:すべての

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

'何をeregei'を! –

+0

私はもっと努力してより多くの正規表現をそれに投げます。これは通常、視界から何かを完全に緩めるのに役立ちます:) - これはコールバックを持っていますので、最初にすべてのリンクを抽出してからyoutubeを探してください:http://stackoverflow.com/questions/6861324/how-to-extract-http -php上の段落と段落からのリンク-php上の配列/ 6861706#6861706 - youtube regex:http:// stackoverflowのためにここに。com/questions/6556559/youtube-api-extract-video-id/6556662#6556662 – hakre

+0

それはちょうど私が見つけたいくつかのテストです。私は提案のために開いています。ありがとうございます – Holsteinkaa

答えて

2

まず、溝eregi。これは廃止予定であり、間もなく消える予定です。

次に、1回のパスでこれを行うのは、あまりにも伸びすぎている可能性があります。私はあなたがこれを3つの段階に分ける方が良いと思います。

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

フェーズリストの上に2回の反復処理し、(parse_urlは、このために途方もなく便利です)リンクがユーチューブに行くかどうかをチェックし、第二のリストに適切な代替を置きます。

フェーズ3:元の一致が含まれているリストと、目的の置換が含まれているリストの2つのリストが作成されました。元のテキストに対してstr_replaceを実行し、検索パラメータの一致リストと置換えの置換リストを提供します。

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

  1. は、リンクを抽出するための正規表現は、それがアカウント
  2. に特殊なホスト名を取る必要はありませんので、それはデバッグが容易で、比較的簡単に維持することができます;検索をダンプしてフェーズ3の前に配列を置き換え、期待通りのものが含まれているかどうかを確認することができます
  3. すべての置換を一度に実行するので、一致が重複したり、置換されたテキストにはまだURLが含まれていますが、もう一度置換する必要はありません)
+0

さて、私はそれを行うことができました:-)非常にありがとうございます。 Plsは最適化のために自分のコードにコメントします。 – Holsteinkaa

0

tdammers' answerでも良いですが、もう1つのオプションは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); 
+0

動作させることができません。 :-( – Holsteinkaa

関連する問題