Я предполагаю, что вы подходите слова или части слов. Вы хотите, чтобы термины поиска, разделенные пробелами, ограничивали результаты поиска, и, похоже, вы намереваетесь возвращать только те записи, в которых есть все слова, предоставленные пользователем. И вы намерены использовать подстановочный знак *
для обозначения 0 или более символов в соответствующем слове.
Например, если пользователь ищет слова term1 term2 , вы намереваетесь вернуть только те элементы, которые имеют оба слова term1
и term2
. Если пользователь ищет слово term *, оно будет соответствовать любому слову, начинающемуся с term
.
Существуют подходящие регулярные выражения, которые эквивалентны этому языку поиска и могут быть сгенерированы из него.
Простой пример, слово term
, может быть подтверждено в регулярном выражении путем преобразования в \bterm\b
. Но два или более слова, которые должны совпадать в любом порядке, требуют предварительных утверждений. Используя расширенный синтаксис, эквивалентное регулярное выражение:
(?= .* \b term1 \b )
(?= .* \b term2 \b )
Подстановочный знак звездочки может быть указан в регулярном выражении с классом символов, за которым следует звездочка. Класс символов определяет, какие буквы вы считаете частью слова. Например, вы можете обнаружить, что [A-Za-z0-9]*
соответствует требованиям.
Короче говоря, вы можете быть удовлетворены, если преобразуете такие выражения, как:
foo ba* quux
до:
(?= .* \b foo \b )
(?= .* \b ba[A-Za-z0-9]* \b )
(?= .* \b quux \b )
Это простой вопрос поиска и замены. Но будьте осторожны, чтобы очистить входную строку, чтобы избежать атак инъекций путем удаления знаков препинания и т. Д.