preg_match_all到javascript

时间:2016-02-05 23:01:45

标签: javascript php html

任何人都可以帮助将这个PHP正则表达式模式转换为兼容JavaScript的模式吗?

PHP

preg_match_all('/(?ims)([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/', $data, $matches);

的Javascript

matches=data.match(/(?ims)([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/);

由于

1 个答案:

答案 0 :(得分:4)

要模仿PHP输出,您需要查看的不仅仅是正则表达式。对于单个匹配,JavaScript match方法将执行此操作,但对于多个匹配,它将不再返回捕获的组。事实上,JavaScript中没有开箱即用的语句,相当于 preg_match_all

最接近的方法是regex.exec,它是唯一可以返回捕获的组和多个匹配的方法。但它不会一次性返回所有比赛。相反,你需要迭代它们,例如:

for (matches = []; result = regex.exec(data); matches.push(result));

现在正则表达式还需要进行一些调整:

在Javascript中,修饰符( ims )不能像你拥有它一样指定,它们必须在结束斜杠之后的末尾指定。请注意,在PHP中,您也可以这样做。

其次,Javascript不支持 s 修饰符。但在你的情况下,这不是问题,因为你的正则表达式不依赖它 - 如果没有那个修饰符,你会得到相同的结果。

为了让 exec 方法返回多个匹配项,正则表达式必须使用 g 修饰符,这在PHP的 preg_match_all <中不需要也不允许/ strong> - 方法名称中的 _all 已经处理了这个问题。

因此,在JavaScript中,正则表达式将如下定义:

var regex = /([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/gim;

最后,匹配以与PHP不同的格式返回。假设数据是“Alpha {78} Beta {333}”,那么PHP将返回:

[["Alpha{78}"," Beta{333}"],["Alpha"," Beta"],["78","333"]]

但是上面的JavaScript代码以转置的方式返回数据(行和列交换):

[["Alpha{78}","Alpha","78"],[" Beta{333}"," Beta","333"]]

所以,如果你也希望它是相同的,你需要转置该数组。以下是您可以使用的通用转置功能:

function transpose(a) {
    return a[0].map(function (val, c) {
        return a.map(function (r) {
            return r[c];
        });
    });
}

所以把它们放在一起,这将完成这项工作:

function transpose(a) {
  return a[0].map(function (val, c) {
    return a.map(function (r) {
      return r[c];
    });
  });
}

// test data:
var data = "Alpha{78} Beta{333}";

var regex = /([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/gim;

// collect all matches in array
for (var matches = []; result = regex.exec(data); matches.push(result));

// reorganise the array to mimic PHP output:
matches = transpose(matches);

console.log(JSON.stringify(matches));
// for this snippet only:
document.write(JSON.stringify(matches));

输出:

[["Alpha{78}"," Beta{333}"],["Alpha"," Beta"],["78","333"]]