Рассматривать
$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 его вариантов? Вот пять различных форматов, с которыми я работаю:
Это может быть сделано с несколькими различными шаблонами.
Это 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]*
означает совпадение ноля или более символов, которые не являются символом возврата строки или новой строки./
в ~
так что разрез между irst
а также Last
не нужно избегатьm
флаг не нужен.Вы могли бы использовать 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
}
Ссылка
Регулярное выражение для обнаружения одной из нескольких строк