繁体   English   中英

preg_match_all转换为javascript

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM