【问题标题】:Convert PHP RegEx to JavaScript RegEx将 PHP 正则表达式转换为 JavaScript 正则表达式
【发布时间】:2012-02-16 10:12:15
【问题描述】:

我有一个 PHP 正则表达式,用于从 URL 中获取 YouTube 视频代码。

我很想将它与 JavaScript 中的客户端正则表达式相匹配。谁能告诉我如何将以下 PHP 正则表达式转换为 JavaScript?

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\‌​n]+#", $url, $matches);

非常感谢,谢谢!

【问题讨论】:

  • 不可能进行直接转换,因为 JavaScript 不支持后视断言。但是,关于如何在 Stack Overflow 上使用 JS 解析 YouTube URL 已经存在大量问题。我已将此标记为可能与 Javascript regular expression for extracting Youtube video ids 重复。
  • 谢谢@AndyE。我目前正在使用其中一种 JavaScript 正则表达式,但我想完全模仿 PHP 正则表达式,因为 JavaScript 版本将“预览”用户在通过 PHP 后应该看到的内容。出于这个原因,如果他们失败了,我需要他们以完全相同的方式失败。
  • 在这种情况下,为什么不重新编写服务器端正则表达式,使其不使用前瞻/后瞻断言?
  • 最终的解决方案是两者都使用:/.*(?:youtu.be\/|v\/|e\/|u\/\w\/|embed\/|\?v=|\&amp;v=)([^#\&amp;\?]*).*/ Stema 确实在他的回答中提供了一些很好的见解,所以我接受了。

标签: php javascript regex youtube


【解决方案1】:

我认为唯一的问题是摆脱后向断言(?&lt;=...),它们在 Javascript 中不受支持。

它们的优点是,您可以使用它们来确保模式在某物之前,但它们不包含在匹配中。

因此,您需要删除它们,意味着将(?&lt;=v=)[a-zA-Z0-9-]+(?=&amp;) 更改为v=[a-zA-Z0-9-]+(?=&amp;),但现在您的匹配以“v=”开头。

如果您只需要验证而不需要匹配的部分,那么没问题,您就完成了。

但如果您需要 v= 之后的部分,则将所需的模式放入捕获组并继续使用这些捕获的值。

v=([a-zA-Z0-9-]+)(?=&)

然后您将在第一组的 $1 中找到匹配的子字符串,第二组在 $2 中找到匹配的子字符串,$3 ...

【讨论】:

  • 太好了,谢谢。我明白你对后向断言的意思,这就是给我错误的原因。谢谢。作为一个完整的正则表达式,你知道最终代码会是什么样子吗?
  • 试试这个v=([a-zA-Z0-9-]+)(?=&amp;)|v\\/([^&amp;\\n]+)(?=\\?)|embed\\/([^&amp;\\n]+)|v=([^&amp;\\n]+)|youtu.be/([^&amp;\\??n]+)
  • @stema,我已经调整了您的正则表达式,因此它只返回 1 个匹配项,因此无需在 5 个匹配项中找到哪个匹配项的 ID (?:vi?=|embed\/|vi?\/|\youtu.be\/)([^&amp;\n]+),适用于我见过的所有网址youtube,这里的例子:rubular.com/r/ctuTE7PwrA
【解决方案2】:

您可以使用这篇文章替换您对断言的看法

Javascript: negative lookbehind equivalent?

【讨论】:

  • JavaScript 正则表达式不支持后向断言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2019-05-11
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多