0

我有这个 preg_match 规则,它将普通的 youtube 链接转换为实际的播放器 html 代码:

preg_match('#(?:http://)?(?:www\.)?(?:youtube\.com/(?:v/|watch\?)|youtu\.be/)([\w-]+)(?:\S+)?#', $text, $youtube_match);

1)如果我在视频链接后面有一个标签,比如说 br 标签:它不起作用http://www.youtube.com/watch?v=4rUGhlNCNho<br />,它可能认为<br是 URL 的一部分。

2)我应该如何修改规则以匹配 url 变量的混合顺序,例如:

http://www.youtube.com/watch?feature=player_embedded&v=4rUGhlNCNho 代替 http://www.youtube.com/watch?v=4rUGhlNCNho

4

3 回答 3

1

If iam right, you only need the parameter v= to generate and embed video

preg_match('#(?:http://)?(?:www\.)?(?:youtube\.com/(?:v/|watch\?)|youtu\.be/)[a-z0-9A-Z\-_\=\&\%\?]*v\=([a-zA-Z0-9]+)#', $text, $youtube_match);
于 2013-01-11T18:53:41.013 回答
0

由于PCREdosent 在lookbehind 内支持可变重复,您可以使用它

(?:http://)?(?:www\.)?(?:youtube\.com/(?:v/|watch\?)|youtu\.be/)([\w-]+)(?:\S+)?$(?<!>)

其他正则表达式风格,你可以使用这个

(?:http://)?(?:www\.)?(?:youtube\.com/(?:v/|watch\?)|youtu\.be/)([\w-]+)(?:\S+)?$(?<!<[^>]*>)
于 2013-01-11T21:41:32.793 回答
0

GreenRover 回答后我的最终代码:

preg_match('#(?:http://)?(?:www\.)?(?:youtube\.com/(?:v/|watch\?)|youtu\.be/)[a-z0-9A-Z\-_\=\&\%\?]*v\=([a-zA-Z0-9]+)([a-zA-Z0-9=&_]+)?#', $text, $youtube_match);

这匹配了这些不同的情况(以带有附加文本的新行结尾,以 BR 标签结尾等):

"http://www.youtube.com/watch?v=4rUGhlNCNho&feature=player_embedded" "http://www.youtube.com/watch?feature=player_embedded&v=4rUGhlNCNho " "http://www.youtube.com/watch?v=4rUGhlNCNho&feature=player_embedded\nETC" "http://www.youtube.com/watch?v=4rUGhlNCNho&feature=player_embedded " "http://www.youtube.com/watch?v=4rUGhlNCNho&feature=player_embedded<br />"

于 2013-01-11T21:34:32.733 回答