2013-08-14 5 views
1

У меня есть булевы поиск строку для третьей партии службы поиска индекса: Germany or (Indian, Tech*)Добавить текст в строку, используя регулярное выражение (preg_replace: PHP) с ограниченными словами

Я хочу, чтобы мой результат будет после обработки: Germany[45] or (Indian[45], Tech*[45]). Здесь 45 - это вес, необходимый службе поиска.

После долгого поискового запроса я смог получить результат: Germany[45] or (Indian[45], Tech[45]*). Здесь вы можете увидеть * пришел после [45], который не требуется.

Выход должен быть: Germany[45] or (Indian[45], Tech*[45]), ищите * до [45].

Код:

preg_replace('/([a-z0-9\*\.])+(\b(?<!or|and|not))/i', '$0'."[45]", $term);

Так что простое понятие позади него, чтобы применить вес слова, но не or/and/not и т.д. булевых поиск чувствительных слов. Пожалуйста, помогите мне настроить мелодию регулярного выражения или дать новое регулярное выражение для получения требуемого результата.

ответ

1

Проблема заключалась в том, что вы получали только совпадения, содержащие \b - границу слова. Поскольку звездочка не является символом слова, он устранял его от матча, так что решение было позволить ни для границы слова или звездочки (\*|\b):

preg_replace('/([a-z0-9.]+)((\*|\b)(?<!or|and|not))/i', '$0'."[45]", $term); 

Однако это проще сделать это с отрицательный предпросмотр:

preg_replace('/\b(?!or|and|not)([a-z0-9*.]+)/i', '$0'."[45]", $term); 

Примечания: Внутри классов символов звездочки и периоды не метасимволы, поэтому они не должны быть экранированы, как вы имели в своем исходном выражении: [a-z0-9\*\.]+.

+0

Спасибо за такое хорошее объяснение ... –

+0

@AakashSahai - добро пожаловать. –

+0

эй, у меня есть другой случай, когда это не работает, PLZ обновить его. «Soft Lang», создавая «Soft [45] Lang» [45], вместо этого он должен отвечать как «Soft Lang» [45]. ожидание обновления –

1

Использование предпросмотр работает как шарм:

preg_replace('/\b(?!or|and|not)([a-z0-9*.])+/i', '$0'."[45]", $term); 

Вы можете попробовать это HERE

Edit: также нет необходимости, чтобы избежать "*" и "" внутри символьного класса

Обратите внимание, что только специальные символы или метасимволы внутри класса символов являются закрывающая скобка (]), обратный слеш(), каретка (^) и дефис (-). Обычные метасимволы являются нормальными символами внутри символьного класса и не требуют экранирования обратной косой черты. Для поиска звезды или плюс используйте [+ *]. Ваше регулярное выражение будет работать нормально, если вы избежите регулярных метасимволов внутри класса символов, но это значительно снижает читаемость.

Источник: http://www.regular-expressions.info/

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

  • Нет связанных вопросов^_^