0

我有一个非常简单的正则表达式,用于在我的应用程序中突出显示搜索词。例如,如果用户在搜索表单中键入“堆栈”,则使用以下正则表达式作为字符串参数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为正则表达式对象?

4

4 回答 4

1

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

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
于 2013-10-07T20:33:08.650 回答
0

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

config = {
    searchRegex: '\b((stack|stacks))\b',
    modifiers: 'i'
}

// ... later
model.initialize = function () {
    config.searchRegex = new RegExp(config.searchRegex, config.modifiers || '');
};
于 2013-10-07T22:17:42.997 回答
0

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

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

于 2013-10-07T20:36:11.920 回答
-5

利用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))
于 2013-10-07T20:01:16.333 回答