preg_match_all()和YouTube REGEX

时间:2012-12-11 19:57:38

标签: php regex arrays youtube preg-match-all

我有这个正则表达式模式来获取YouTube视频ID

preg_match_all( '/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i', $string, $res );

然而,下面的示例中的字符串似乎无法正常工作:

<?php

$string = "yet, another youtube video.

[url=http://www.youtube.com/watch?feature=player_embedded&v=6kVpM5WK5JI#]http://www.youtube.com/watch?feature=player_embedded&v=6kVpM5WK5JI#[/url]


Fonte:onothersite";

preg_match_all( '/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i', $string, $res );

print_r($res);

?>

上面的代码输出:

Array (
  [0] =>
    Array (
      [0] => youtube.com/watch?feature=player_embedded&v=6kVpM5WK5JI#]http://www.youtube.com/watch?feature=player_embedded&v=6kVpM5WK5JI#[/url] Font
    )
  [1] => 
    Array ( 
      [0] => url] Font
    )
)

应该输出:

Array (
  [0] =>
    Array (
      [0] => youtube.com/watch?v=6kVpM5WK5JI
    )
  [1] => 
    Array ( 
      [0] => 6kVpM5WK5JI 
    )
)

知道如何解决这个问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

注意贪婪的模式,例如.+.*!我分别用[^\/]+[^#]*替换它,它似乎有效。

preg_match_all( '/(?:youtube\.com\/(?:[^\/]+\/[^\/]+\/|(?:v|e(?:mbed)?)\/|[^#]*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i', $string, $res );

给出

Array ( 
    [0] => Array ( 
        [0] => youtube.com/watch?feature=player_embedded&v=6kVpM5WK5JI 
        [1] => youtube.com/watch?feature=player_embedded&v=6kVpM5WK5JI 
        ) 
    [1] => Array ( 
        [0] => 6kVpM5WK5JI 
        [1] => 6kVpM5WK5JI 
        ) 
    ) 

更新了以删除第二个贪婪模式。