У меня есть логическая строка поиска для сторонней службы поиска индексов: 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/