У меня есть строка и список имен, которые я сравниваю строку с использованием preg_match_all
который возвращает совпадения. Однако в списке имен некоторые имена имеют имя ИЛИ только фамилию, а другие — оба. Смотрите мой пример ниже.
$names = 'jon|jon snow|lana|smith|lana smith|megan';
$string = 'Jon Snow and Lana Smith met up with Lana and Megan.';
preg_match_all("~\b($names)\b~i", $string, $matches);
Приведенный выше пример с моим текущим выражением возвращает все имена. Что не то, что я хочу.
Что я хочу вернуть: Джон Сноу, Лана Смит, Лана, Меган.
То, что я не хочу вернуть: Джон, Смит
Кажется, вы ищете негативные утверждения.
Например, jon(?! snow)
Матчи "jon"
, но только если " snow"
не следует.
$names = 'jon(?! snow)|jon snow|lana(?! smith)|(?<!lana )smith|lana smith|megan';
Попробуй это жить на regex101.com.
Другая возможность — менее явная, но с сопоставимыми результатами — состоит в том, чтобы сначала проверить «составные» термины:
$names = 'jon snow|jon|lana smith|lana|smith|megan';
Попробуй это жить на regex101.com.
Других решений пока нет …