猜猜这是一个非常简单的问题。我有一个正则表达式和PHP看起来像这样:
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $v, $matches);
(它从不同类型的网址中删除了youtube代码)。我必须将其移植到javascript,我想使用相同的正则字符串。
我尝试了以下内容:
yturl.match(/#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be\/)[^&\n]+#/)
但是这在Firebug中给了我这个错误:invalid quantifier
任何人都知道我做错了什么?
(我在Javascript中没有使用正则表达式的经验。所以请原谅我的愚蠢问题)
答案 0 :(得分:5)
几个问题:
#
)添加到JavaScript正则表达式中。youtu.be
应为youtu\.be
。请改为尝试:
var myregexp = /\b(?:v\/|v=|youtu\.be\/)([^&\n]+)/;
var match = myregexp.exec(subject);
if (match != null) {
result = match[1];
} else {
result = "";
}
这将产生与PHP正则表达式完全相同的结果,但它更容易阅读。它是否会返回正确的结果是另一个问题 - PHP正则表达式的质量使我怀疑它可能有更多的问题,而不仅仅是明显的问题。
答案 1 :(得分:0)
你的正则表达式中仍然有来自PHP的#
分隔符...尝试删除它:
yturl.match(/(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be\/)[^&\n]+/)
答案 2 :(得分:0)
在您的JavaScript regexp中,您使用'/'作为分隔符,但您还添加了PHP版本的'#'分隔符。
从JS版本中删除'#'符号
答案 3 :(得分:0)
PHP preg_match使用Perl样式正则表达式,而Javascript则不然。快速阅读:http://www.thespanner.co.uk/2008/02/01/javascript-regular-expressions/并告诉我这是否有助于您了解差异。