忽略视频网址中的换行符

时间:2015-02-01 02:12:42

标签: php regex url youtube

我想用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
)

1 个答案:

答案 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中测试此方法。