我有这个正则表达式模式来获取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
)
)
知道如何解决这个问题吗?
感谢。
答案 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
)
)
更新了以删除第二个贪婪模式。