2011-01-01 6 views
0

私はregexpressionでpreg_match_allを持っています。これはyoutubeのビデオ番号をとり、配列に配置する必要があります。そのため、より多くのyoutubeビデオがあるほど、配列が多くなります。ここでは正しい結果、だ:Regex pregmatch not correct "sometimes"

C2

Array ([0] => _dKtoRU7Tlk http://www.youtube.com/watch?v=_dKtoRU7Tlk http://www.youtube.com/watch?v=_dKtoRU7Tlk) 1 

は、違いを参照してください?

C1

Array ([0] => j5-yKhDd64s) 1Array ([0] => j5-yKhDd64s) 1Array ([0] => j5-yKhDd64s) 1 

は今、私の問題は時々この問題が発生していますかC1には、ararysのビデオIDが正しいので、C2を取得して失敗し、残りの部分をアレイに取り込みます。

C1ユーチューブリンクはこのようなものだった: http://www.youtube.com/watch?v=j5-yKhDd64s&feature=email&email=comment_reply_received

comment_reply_received

http://www.youtube.com/watch?v=j5-yKhDd64s&feature=email&email=comment_reply_received http://www.youtube.com/watch?v=j5-yKhDd64s &機能=メール&メール=

C2 youtube linksは次のとおりです:

http://www.youtube.com/watch?v=_dKtoRU7Tlk http://www.youtube.com/watch?v=_dKtoRU7Tlk http://www.youtube.com/watch?v=_dKtoRU7Tlk

差がC1に... &機能があるということです。私は正規表現が完全に最適ではないので、そのことを考えていますか?

if (preg_match_all("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $content, $matches, PREG_SET_ORDER)) { 
     foreach($matches as $m) { 
    echo print_r($m); 
     } 
    } 
    $nContent = preg_replace("#(?:https?://)?(?:www\.)?youtube\.com/(?:[^\s]*)#", '', $content); 
    echo $nContent; 

これはどのように修正できますか?ありがとうございました!

答えて

3

あなたの正規表現:

#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+# 

は、3つの代替部品に沸く:

(?<=v=)[a-zA-Z0-9-]+(?=&) 
(?<=[0-9]/)[^&\n]+ 
(?<=v=)[^&\n]+ 

(?<=...)は、戻り読みアサーションと呼ばれ、これらの部分の二つにあなたはそれがv=探し参照されます。

最初の選択肢では、[a-zA-Z0-9-]+の後に&が続きます。 (先読みアサーション:(?=...)

この場合、2番目の選択肢は適用されません。

第3の代替方法では、&または\nになるまで何かを探します。

あなたの例は、それらのいずれにも正しく適合しません。それは&または任意の空白(\s)に一致しなくなりますので

(?<=v=)[^&\s]+ 

(?<=v=)[^&\n]+ 

:最も簡単な修正は最後の部分を変更することです。

より良いアドバイス:実際にはURLを通常の方法で実際に解析して、将来の頭痛を軽減するだけです。

+0

ありがとう!最後の「より良い」アドバイスについて、あなたが念頭に置いていたことについて、より多くのことを知りたいと思います。 "通常の方法でURLを解析する"、これは何を意味するのですか、少しの例ですか? – Karem

+0

@Karem:例。テキスト( '#http:// [^ \ s] +#')からURL全体を照合し、http://php.net/manual/en/function.parse-url.phpを見てから、クエリ部分と 'parse_str'を使って別のバールに分割します。 – mvds

+0

それであなたが最初の試合では、リンクがあれば、リンクを取って質問し、取る?vビデオリンクを取得する...正しい? – Karem

0

編集:この1匹の魚うち任意のユーチューブビデオリンク、それはこれがMVDSの答えに続き、あなたに開始

"{youtube.com/watch[?]v=([a-z0-9_-]*?)[^&\s]+}i" 
2

を与え、空白、改行または「&」

希望に停止しますので がそれを変更コメント:

$parsed_url = parse_url("http://www.youtube.com/watch?v=j5-yKhDd64s&feature=email&email=comment_reply_received"); 
parse_str($parsed_url["query"],$output); 
echo $output['v']; 
+0

ありがとう!そして@Karem、 'preg_match_all(" #http:// [^ \ s] +#i "、$ txt、$ matches)'を使い、 'foreach($ matches [0] as $ url) {...} ' – mvds