如何即时将字符串编码的 PHP 正则表达式转换为 JS 正则表达式


How to convert string-encoded PHP regex to JS regex on the fly?

>我有一个非常简单的正则表达式,用于突出显示应用程序中的搜索词。 例如,如果用户在搜索表单中键入"stack",则以下正则表达式将用作字符串参数,以便preg_match_all突出显示结果:

"/'b((stack|stacks))'b/i"

我正在使用json_encode为我的应用程序输出一些配置选项,包括上面的正则表达式。 我在客户端需要这个正则表达式,因为我以无限滚动的方式延迟加载分页项,并且我想利用客户端来解析 HTML 以获得正确的搜索词突出显示。

我的 JS 配置对象现在类似于:

config = {
   searchRegex: "/'b((stack|stacks))'b/i",
   // ... more options
}

如果searchRegex不是字符串,我就不会有问题。 它将自动成为一个正则表达式对象,并且该正则表达式中没有任何 JavaScript 不支持的内容。 但是现在,我必须求助于解析字符串以获取RegExp构造函数的适当参数,这涉及删除分隔符并获取修饰符。 由于可能存在所有转义字符,这似乎不是一个可行或理智的选择。

如何将searchRegex转换为正则表达式对象?

一个非常笨拙的方法是评估它。如果您可以信任输入,这可能是一个不错的解决方案。

function evalRegExp(str) {
  return eval(str);
}
var re = evalRegExp("/foo/i");
// => /foo/i

如果您经常使用它,则可以将其作为方法直接添加到RegExp

RegExp.eval = function(str) {
  return eval(str);
};
var re = RegExp.eval("/foo/i");
// => /foo/i

也许不是最好的解析,但我已经让它解析为数组[regexp, modifiers]准备创建一个新的RegExp实例。希望对你有帮助...

'/some[a-z]+regex/i'.replace(/^(.)(.+)'1([gim])+/, function (foo, bar, regexp, modifiers) { return [regexp, modifiers].join('___') }).split('___')

感谢您的回答。 我决定将基于正则表达式的字符串无修饰符和分隔符输出到客户端,并使用 JS 将其和分隔的修饰符传递给 RegExp 构造函数。 最终得到类似于以下内容的内容:

config = {
    searchRegex: ''b((stack|stacks))'b',
    modifiers: 'i'
}
// ... later
model.initialize = function () {
    config.searchRegex = new RegExp(config.searchRegex, config.modifiers || '');
};

使用 unescape()

http://www.w3schools.com/jsref/jsref_unescape.asp

var str="Need tips? Visit W3Schools!";
var str_esc=escape(str);
document.write(str_esc + "<br>")
document.write(unescape(str_esc))