[英]preg_match_all to javascript
任何人都可以帮助将此PHP regex模式转换为JavaScript兼容模式吗?
的PHP
preg_match_all('/(?ims)([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/', $data, $matches);
Java脚本
matches=data.match(/(?ims)([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/);
谢谢
为了模仿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中既不需要也不允许-方法名中的_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"]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.