Regex для анализа всех слов в строке, которая следует за одним из пяти определенных префиксов

Рассматривать

$email = "Name: John Smith \n
Phone: 1-888-555-5555
...";

Предположим, у меня есть код выше, и мне нужно отфильтровать строку после слова «Имя:». Я занимаюсь:

if (preg_match("/Name:*? (.*)/m", $email, $g) === 1){
echo $g[1]."\n"; //John Smith
}

Как можно написать оператор регулярного выражения, если строка явно не начинается со слова «Имя:», а является одним из 5 его вариантов? Вот пять различных форматов, с которыми я работаю:

  • Название:
  • ФИО:
  • Ф. Имя:
  • Первый фамилия:
  • Название.

1

Решение

Это может быть сделано с несколькими различными шаблонами.

Это PHP-код, чтобы продемонстрировать вашу реализацию шаблона

$email='Name: John Smith
Phone: 1-888-555-5555
...';

if(preg_match('/Name[:.] \K[^\r\n]*/',$email,$g)){
echo $g[0]; //John Smith
}

echo "\n\n---\n\n";

$mult='Name: John Smith
Phone: 1-888-555-5555
...
Name. Jane Smith
Phone: 1-888-555-5556
...
First/Last Name: Joe Smith
Phone: 1-888-555-5557
...
';

var_export(preg_match_all('/Name[:.] \K[^\r\n]*/',$mult,$g)?$g[0]:'fail');

Шаблон № 1: (более снисходительно) /Name[:.] \K[^\r\n]*/ демонстрация

Шаблон № 2: (более буквально) ~(?:Name.|(?:F(?:. |ull |irst/Last ))?Name:) \K[^\r\n]*~ демонстрация

Некоторые заметки:

  • [:.] означает совпадение с любым из символов (двоеточие или точка).
  • \K означает «начать поиск полной строки с этой точки в шаблоне».
  • [^\r\n]* означает совпадение ноля или более символов, которые не являются символом возврата строки или новой строки.
  • разделитель в шаблоне № 2 изменен с / в ~ так что разрез между irst а также Last не нужно избегать
  • m флаг не нужен.
1

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

Вы могли бы использовать or string согласование

$email = "Name: John Smith \n
Phone: 1-888-555-5555
...";

if (preg_match("/(Name:|Full Name:|F. Name:|First\/Last Name:|Name.) (.*)/m", $email, $g) === 1){
echo $g[1]."\n"; //John Smith
}

Ссылка

Регулярное выражение для обнаружения одной из нескольких строк

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector