我想用iframe替换YouTube网址。因此,我使用的是从不同网站复制的正则表达式,该网站从YouTube网址中获取视频ID。
它并不完美。如果有换行符,则不会占用整个视频ID。此外,它也不会从网址中获取&feature=share
。
例如:
输入:
http://www.youtube.com/attribution_link?a=_NDwn20sMog&u=/watch?v=zl-GC1
6vBm4&feature=share
正则表达式:
/(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|attribution_link\?a=.+?watch.+?v(?:%|=)|watch\?(?:\S*?&?v\=))|youtu\.be\/)([a-zA-Z0-9_-]{6,11})/i
输出:
Array
(
[0] => zl-GC1
)
Array
(
[0] => http://www.youtube.com/attribution_link?a=_NDwn20sMog&u=/watch?v=zl-GC1
)
答案 0 :(得分:0)
通过擦除潜在的空白然后匹配来简化。
这是我的意思的一个例子......
<?php
$test = <<<TEST
http://www.youtube.com/attribution_link?a=_NDwn20sMog&u=/watch?v=zl-GC1
6vBm4&feature=share
TEST;
$test = preg_replace('/\s/', '', $test); // NOTE: Scrub potential whitespace.
// NOTE: (&.*)* added to the end of the original pattern to match the
// rest of the query string if any.
preg_match('/(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|attribution_link\?a=.+?watch.+?v(?:%|=)|watch\?(?:\S*?&?v\=))|youtu\.be\/)([a-zA-Z0-9_-]{6,11})(&.*)*/', $test, $matches);
var_dump($matches);
?>
...,输出:
array(3) {
[0]=>
string(90) "http://www.youtube.com/attribution_link?a=_NDwn20sMog&u=/watch?v=zl-GC16vBm4&feature=share"
[1]=>
string(11) "zl-GC16vBm4"
[2]=>
string(14) "&feature=share"
}
您可以在Ideone demo中测试此方法。