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?
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 || '');
};
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))
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
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('___')