preg_match, скобки и ограничитель слова?

93
05 октября 2019, 10:20

Подскажите как заставить работать код?

if (preg_match("/\bпривет (мир)\b/iu", "привет (мир)")) {
    return true;
} else {
    return false;
}

preg_quote не помогает.

Answer 1

Значение границы слова зависит от контекста. Если \b стоит после скобки, которая не является "словным" символом (буква, цифра или знак подчёркивания), она требует "словный" символ после скобки. Так как в указанной строке после скобки конец строки, совпадения нет.

Используйте контекстонезависимые границы слова (?<!\w) и (?!\w):

$word = "привет (мир)";
return(preg_match("/(?<!\w)" . preg_quote($word, "/") . "(?!\w)/iu", "привет (мир)"));

Шаблон (?<!\w) — блок предварительного просмотра назад, который находит позицию в строке, сразу перед которой нет "словного" символа, а (?!\w) — блок предварительного просмотра вперёд, который находит позицию в строке, сразу после которой нет "словного" символа.

Если под границей слова понимать пробельные символы, замените (?<!\w) и (?!\w) на (?<!\S) и (?!\S).

preg_quote($word, "/") необходим для правильного экранирования символов, которые является специальными символами регулярных выражений, такие как ?, +, (, ), [ и другие.

READ ALSO
SOAP afas не видит поле

SOAP afas не видит поле

могли бы вы направить на решение?

126
Как вывести количество юзеров у которых есть группы в определенном отрезке времени

Как вывести количество юзеров у которых есть группы в определенном отрезке времени

Собственно говоря есть категория юзеров $participants, которые состоят в группах и нет, у групп есть время начала $start_time и конца $end_time , нужно вывести...

108
Как узнать параметры FastCGI?

Как узнать параметры FastCGI?

Иногда скрипт падает при дебаге, когда остановится на брейкпоинте по таймаутуГрешу на FcgidIOTimeout, так как по умолчанию у него 40 секунд и в логах...

116