2013-10-07 2 views
0

У меня очень простое регулярное выражение, которое я использую для выделения поисковых запросов в моем приложении. Если пользователь вводит в «стек» в поисковой форме, например, следующее регулярное выражение используется в качестве аргумента строки для preg_match_all, чтобы выделить результаты:Как преобразовать регулярное выражение PHP в JS-regex на лету?

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

Я использую json_encode для вывода некоторых из моей конфигурации варианты для моего приложения, включая регулярное выражение выше. Мне нужно это регулярное выражение на стороне клиента, потому что я lazy-load pagination items с бесконечным прокруткой, и я хочу использовать клиентскую сторону для анализа HTML для правильного выделения поискового запроса.

объект конфигурации My JS теперь появляется подобное:

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

Если searchRegex не строка, я бы не проблема. Он автоматически будет объектом регулярного выражения, и в этом регулярном выражении нет ничего, что JavaScript не поддерживает. Но теперь я должен прибегнуть к разбору строки, чтобы получить соответствующие аргументы для конструктора RegExp, который включает в себя удаление разделителей и получение модификаторов. Со всеми экранированными символами, которые могут присутствовать, это не похоже на жизнеспособный или разумный вариант.

Как бы преобразовать searchRegex, чтобы стать объектом регулярного выражения?

+0

См http://stackoverflow.com/questions/874709/converting-user-input-string-to-regular-expression. Это не дает другого решения, кроме использования конструктора RegExp, но я думаю, что нет. –

+0

Почему бы не упростить ваш reg-ex с помощью '/ \ b (stacks?) \ B/i', который затем будет мутирован в'/\\ b (stacks?) \\ b/i'? – Stphane

ответ

0

Спасибо за ваши ответы. Я решил выдать модификаторы строк и разделителей на основе регулярных выражений клиенту и использовать JS для передачи его, а выделенный модификатор - в конструктор RegExp. Законченный с чем-то подобным:

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

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

это лучший подход .. но персонажи все равно сбегут. –

-4

Использование 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)) 
+0

nice no comment -1 – Populus

+0

Это совсем не поможет. –

+0

Ничего не связано с вопросом –

1

действительно Hacky способ сделать это, чтобы Eval его. Если вы можете доверять входам, это может быть приемлемым решением.

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 
+0

не следует использовать RegExp.prototype.evalRegExp = function() {}; –

+0

@PsychHalf hmm no. Если функция помещается в прототип, это означает, что нам нужен экземпляр RegExp для вызова этой функции.Включение функции непосредственно в 'RegExp' делает ее вроде фабрики, которая фактически возвращает новый экземпляр' RegExp'. –

+0

Никогда не думал об этом, спасибо. Я склонен воздерживаться от «eval» (и это справедливо), но я забыл, что это было бы просто, если бы я его использовал. – danronmoon

0

Возможно не лучший синтаксического анализа, но я уже получил это работает разобраны как массив [regexp, modifiers] готов к созданию нового экземпляра RegExp. Надеюсь, что это помогает ...

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

+0

Я думаю, что у вас возникнут проблемы с экранированными разделителями. Например, '/ foo \/bar/i'. Не говоря уже о том, что если в строке ввода была '___', она также потерпит неудачу. –

+0

@ maček yeah, вы правы :(Я сожалею о полном «решении» прямо сейчас ... просто неважно. –

Смежные вопросы