2016-12-16 15 views
0

最近私はまだ私は初心者ですので、これは非常に単純な質問ですが、私は解決策を見つけることができませんでしたこの問題に。文字列からすべてのリンクを置き換える方法

私は、すべてのyoutubeリンクをiframeに置き換え、通常のリンクにURLの残りの部分を置き換えることを期待していたこのコードを持っていますが、それはうまくいかず、何が間違っているのかわかりません。 SQLデータベース上の別のテキストレコードを返し

 <?php 
      if (strpos($text[$i], 'youtube.com') !== false) { 
       $text[$i] = preg_replace('/\s*[a-zA-Z\/\/:\.]*youtube.com\/watch\?v=([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i','<iframe width=\"420\" height=\"315\" src="http://youtube.com/embed/$1\" allowfullscreen></iframe>', $text[$i]); 
      } else { 
       $text[$i] = preg_replace('#(\A|[^=\]\'"a-zA-Z0-9])(http[s]?://(.+?)/[^()<>\s]+)#i', '\\1<a target="_blank" href="\\2">\\3</a>', $text[$i]); 
      } ?> 
<div class="post"> 
    <?php print $author[$i]; ?> 
    <?php print $time[$i]; ?> 
    <?php print $text[$i]; ?> 
</div> 

$テキスト[$ i]を。

すべてのURLをiframeに置き換えることは可能でしょうか、これを他の方法でリンクしますか? アドバイスをいただきありがとうございます。

+0

watch=v?を置き換えることができますか? 'text [$ i]'とは何ですか? – chris85

+0

@ chris85このコードは、SQLデータベースからの投稿を再表示します。 '$ text [$ i]'はデータベースの行テキストの値を返します。 –

+0

'text [$ i]'のリテラル値がなければ、本当に助けになりません。文字は一度文字クラスに入れる必要があるだけで、文字クラスの '.'はエスケープする必要はありません。 – chris85

答えて

0

$text[$i]の値が標準www.youtube.com/watch=v?のリンクであると仮定すると、いくつかの.htaccessをPHPと組み合わせたようです。あなたが$1\の代わりに何かをロードするために、この

<iframe src="http://youtube.com/embed/$1\"> 

を意図している場合$1\ではなく、変数の文字列の一部として認識されているので、それは動作しません。

<?php 
     if (strpos($text[$i], 'youtube.com') !== false) { 
      $needle = explode("watch=v?",$text[$i]); 
      $text[$i] = str_replace($text[$i], '<iframe width=\"420\" height=\"315\" src="http://youtube.com/embed/'.$needle[1].'" allowfullscreen></iframe>', $text[$i]); 
     } 
?> 

爆発(から配列を作成する:あなたは$needleに保管してください(またはあなたが好きな)、その後、src="http://youtube.com/embed/'.$needle.'"

1.迅速かつ汚いソリューションを、watch=v?後の文字列を取り除く必要があります区切られた文字列)はを$needleに分割して$needle[1] = "youtube-video-id"とします。これが理由で$needle[1]が使用されている理由です。<iframe src="http://youtube.com/embed/'.$needle[1].'">

これでビデオIDは取得できません。 $needle[1]は、watch=v?の後に来るものは$text[$i]だから心に留めてください。

ETA:$text[$i]のhttpまたはhttpsをそのまま使用して、$needle[0]に「https://www.youtube.com/」という文字列を含めることができます。 注:サイトがhttpsで、iframe srcがhttpの場合、クロスサイトスクリプティングエラーが発生します。

$text[$i] = str_replace($text[$i], '<iframe width=\"420\" height=\"315\" src="'.$needle[0].'embed/'.$needle[1].'" allowfullscreen></iframe>', $text[$i]); 

2.よりよい解決策:

リンクを想定すると、通常のhttps://www.youtube.com/watch=v?asdf1234は、あなたはそれが何をするんembed/

<?php 
    if (strpos($text[$i], 'youtube.com') !== false) { 
     $needle = str_replace("watch=v?","embed/",$text[$i]); 
     $text[$i] = str_replace($text[$i], '<iframe width=\"420\" height=\"315\" src="'.$needle.'" allowfullscreen></iframe>', $text[$i]); 
    } 
?> 
+0

ご協力いただきありがとうございますが、動画のIDを保存するにはどうすればよいですか? –

+0

私は特定のことが行われた理由についての解説を更新しました。覚えておいてください、それは迅速かつ汚れた解決策であり、調整が必要な場合があります。 – avengefulghost

関連する問題