获取所有url类型的youtube id

2022-03-29 00:00:00 regex php preg-match
以下代码适用于除youtu.be以外的所有Youtube域。例如:http://www.youtube.com/watch?v=ZedLgAF9aEg将变为:ZedLgAF9aEg

我的问题是我如何才能使它与http://youtu.be/ZedLgAF9aEg一起工作。 我对正则表达式不是很在行,所以非常感谢您的帮助。我的代码是:

    $text = preg_replace("#[&?].+$#", "", preg_replace("#http://(?:www.)?youtu.?be(?:.com)?/(embed/|watch?v=|?v=|v/|e/|.+/|watch.*v=|)#i", "", $text)); }
$text = (htmlentities($text, ENT_QUOTES, 'UTF-8'));

再次感谢!


解决方案

您的正则表达式现在似乎可以解决问题?我没有在php中尝试,但在我的编辑器中似乎运行得很好。

正则表达式的第一部分http://(?:www.)?youtu.?be(?:.com)?/匹配http://youtu.be/,第二部分(embed/|watch?v=|?v=|v/|e/|.+/|watch.*v=|)|)结束,这意味着它不与任何匹配(使其成为可选的)。换言之,它将删除http://youtu.be/,仅保留id。

我想更直观的编写方法是将整个if分组设置为可选的,但据我所知,您的正则表达式已经解决了您的问题:

 #http://(?:www.)?youtu.?be(?:.com)?/(embed/|watch?v=|?v=|v/|e/|.+/|watch.*v=)?#i
注意:您的正则表达式也适用于www.youtu.be.com域。它将被剥离,但如果您使用它来验证输入,则需要注意的事项。

更新:

如果只想匹配[youtube][/youtube]标记内的URL,可以使用look arounds。 大概是这样的:

(?<=[youtube])(?:http://(?:www.)?youtu.?be(?:.com)?/(?:embed/|watch?v=|?v=|v/|e/|[^[]+/|watch.*v=)?)(?=.+[/youtube])

您可以通过使前瞻中的.+仅匹配有效的URL字符等方式进一步细化它。

相关文章