任何人都可以帮助将这个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"]]