Найти имена в строке с помощью регулярных выражений, не включая имена, если присутствует второе имя

У меня есть строка и список имен, которые я сравниваю строку с использованием 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);

Приведенный выше пример с моим текущим выражением возвращает все имена. Что не то, что я хочу.

Что я хочу вернуть: Джон Сноу, Лана Смит, Лана, Меган.

То, что я не хочу вернуть: Джон, Смит

1

Решение

Кажется, вы ищете негативные утверждения.

Например, 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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]