Добавить текст в строку с использованием регулярного выражения (preg_replace: php) с ограниченными словами

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

Я хочу, чтобы мой результат был после обработки: 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 т. Д. Булевым поисковым словам. Пожалуйста, помогите мне настроить мелодию регулярного выражения или дать новое регулярное выражение для получения требуемого результата.

Проблема заключалась в том, что вы получали только совпадения, включающие a \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\*\.]+ как в исходном выражении: [a-z0-9\*\.]+ .

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

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

Вы можете попробовать это ЗДЕСЬ

Изменить: Также не нужно бежать «*» и «.». внутри символьного класса

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

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