任何人都可以帮助将这个PHP正则表达式模式转换为兼容JavaScript的模式吗?
PHP
preg_match_all('/(?ims)([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/', $data, $matches);
的Javascript
matches=data.match(/(?ims)([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/);
由于
答案 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"]]