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

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

 “/ \ b((stack | stacks))\ b / i”
</ code> </ pre>

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

我的JS配置对象现在看起来类似于:</ p>

  config = {
searchRegex:“/ \ b((stack | stacks))\ b / i“,
// ...更多选项
}
</ code> </ pre>

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

如何将 searchRegex </ code>转换为正则表达式 对象?</ p>
</ div>

展开原文

原文

I have a very simple regex that I am using for highlighting search terms in my application. If a user types in 'stack' into the search form, for example, the following regular expression is used as a string argument for preg_match_all to highlight the results:

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

I am using json_encode to output some of my configuration options for my application, including the regex above. I need this regex on the client-side because I am lazy-loading pagination items in an infinite-scroll fashion, and I want to take advantage of the client-side to parse the HTML for the proper search term highlighting.

My JS configuration object now appears similar to:

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

If searchRegex wasn't a string, I wouldn't have a problem. It would automatically be a regular expression object, and there is nothing in that regex that JavaScript doesn't support. But now, I have to resort to parsing the string to get the appropriate arguments for the RegExp constructor, which involves removing the delimiters and getting the modifier(s). With all the escaped characters that could be present, this doesn't seem like a viable or sane option.

How would I convert searchRegex to become a regular expression object?

douchen1924
douchen1924 为什么不用/\b(stacks?)\b/i简化你的reg-ex,然后将其变为/\\b(stacks?)\\b/i?
大约 7 年之前 回复
doulou1989
doulou1989 请参阅stackoverflow.com/questions/874709/....除了使用RegExp构造函数之外,它没有提供另一种解决方案,但我认为没有。
大约 7 年之前 回复

4个回答



感谢您的回答。 我决定将基于正则表达式的字符串sans修饰符和分隔符输出到客户端,并使用JS将它和分离的修饰符传递给 RegExp </ code>构造函数。 结束类似于:</ p>

  config = {
searchRegex:'\ b((stack | stacks))\ b',
修饰符:'i'\ n}

// ...稍后
model.initialize = function(){
config.searchRegex = new RegExp(config.searchRegex,config.modifiers ||'');
};
< / code> </ pre>
</ div>

展开原文

原文

Thanks for your answers. I decided to output the regex-based string sans modifiers and delimiters to the client and use JS to pass it and the separated modifier to the RegExp constructor. Ended up with something similar to:

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

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

douou1891
douou1891 这是一个更好的方法..但角色仍然会逃脱..
大约 7 年之前 回复

A really hacky way to do this is to eval it. If you can trust the inputs, it might be an okay solution.

function evalRegExp(str) {
  return eval(str);
}

var re = evalRegExp("/foo/i");
// => /foo/i

If you use this a lot, it might be okay to add this as a method directly to RegExp

RegExp.eval = function(str) {
  return eval(str);
};

var re = RegExp.eval("/foo/i");
// => /foo/i
duannuochi3549
duannuochi3549 你是对的..代码运行正常但在我的调试器中我得到了......第1行:RegExp.eval = function(str){---期望一个标识符,而是看到'eval'(一个保留字)。 第1行:RegExp.eval = function(str){--- eval是邪恶的。 第2行:返回eval(str); --- eval是邪恶的。 所以我只是问......
大约 7 年之前 回复
dongzouhe9734
dongzouhe9734 对,eval通常是一个不明智的使用方法,但在这种特殊情况下,如果你相信输入,它可能很好。
大约 7 年之前 回复
douluan5738
douluan5738 没想到这个,谢谢。 我倾向于避免使用eval(这是理所当然的)但我忘了如果我使用它就会那么简单。
大约 7 年之前 回复
doujing8435
doujing8435 嗯不。 如果函数放在原型上,这意味着我们需要一个RegExp实例来调用该函数。 将函数直接放在RegExp上使它有点像工厂实际上返回一个新的RegExp实例。
大约 7 年之前 回复
duanlu9557
duanlu9557 我们不应该使用RegExp.prototype.eval RegExp = function(){};
大约 7 年之前 回复



也许不是最好的解析但是我已经将它解析为数组 [regexp,modifiers] </ code> 准备创建 RegExp </ code>的新实例。 希望它有帮助...... </ p>

'/ some [az] + regex / i'.replace(/ ^(。)(。+)\ 1([gim]) + /,函数(foo,bar,regexp,modifiers){return [regexp,modifiers] .join('___')})。split('___')</ code> </ p>
</ div>

展开原文

原文

Maybe not the best parse but i've got it working parsed as an array [regexp, modifiers] ready to create a new instance of RegExp. Hope it helps...

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

doutun9179
doutun9179 是的,你是对的:(我对现在的整个“解决方案”感到遗憾......只是没关系。
大约 7 年之前 回复
doushihu5475
doushihu5475 我认为你在这里有逃脱的分隔符有问题。 比如/ foo \ / bar / i。 更不用说,如果输入字符串中包含___,它也会失败。
大约 7 年之前 回复

Use 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))
dongxingchang9345
dongxingchang9345 他想要翻看字符串?
大约 7 年之前 回复
dongxi7704
dongxi7704 与此问题无关
大约 7 年之前 回复
dst2017
dst2017 这根本没有用。
大约 7 年之前 回复
dongma2388
dongma2388 不好评论-1
大约 7 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐