preg_match_all to javascript


preg_match_all to javascript

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

.PHP

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

爪哇语

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

谢谢

要模仿 PHP 输出,您需要查看的不仅仅是正则表达式。对于单个匹配,JavaScript 匹配方法可以解决问题,但对于多个匹配项,它将不再返回捕获的组。事实上,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中是不需要的,也不允许这样做 - 方法名称中的_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"]]