Javascript正则表达式相当于php失败

时间:2011-11-14 12:39:05

标签: javascript regex

猜猜这是一个非常简单的问题。我有一个正则表达式和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中没有使用正则表达式的经验。所以请原谅我的愚蠢问题)

4 个答案:

答案 0 :(得分:5)

几个问题:

  1. 您已将PHP分隔符(#)添加到JavaScript正则表达式中。
  2. JavaScript不支持lookbehind,因此您无法在JavaScript中使用PHP正则表达式
  3. 你的正则表达式是多余的。第三种选择匹配第一种选择匹配的所有内容。
  4. 正则表达式有错误:youtu.be应为youtu\.be
  5. 请改为尝试:

    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/并告诉我这是否有助于您了解差异。