0

我有这个正则表达式模式来获取 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 
    )
)

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

谢谢。

4

1 回答 1

1

小心贪婪的模式,比如.+and .*!我分别用[^\/]+and替换了它[^#]*,它似乎有效。

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 
        ) 
    ) 

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

于 2012-12-11T20:13:38.080 回答