Как правильно построить регулярное выражение И. О. Фамилия, отсекая ненужное?
Осуществляю поиск в файле формата И. О. Фамилия (на русском или английском). Так как текст берётся из PDF, некоторые строки слиплись и не могу разобраться, как указать конец Фамилии, чтобы дальше не шла другая строка. Наверное, это нужно указывать через [а-яёa-z]$, но так данные не находятся. Вот пример регулярного выражения, что я имею на данный момент:
$result=preg_grep ('/[А-ЯA-Zа-яa-z].[А-ЯA-Zа-яa-z]{1,2}. [А-ЯA-Z]/u', $pdfArr ); |
$result=preg_grep ('/[А-ЯA-Zа-яa-z].[А-ЯA-Zа-яa-z]{1,2}. [А-ЯA-Z]/u', $pdfArr );
Результатом выходят следующие строки:
[182] => A.Sh. Akysh(Akishev)p
[567] => A.Sh. Akysh(Akishev)Proof.
[913] => A.Sh. Akysh(Akishev)
[962] => А.Ш. Акыш (Акишев)
Что необходимо дописать в выражение, чтобы получать только И. О. Фамилия? (можно с фамилией из скобки или без неё)
Дополнительно:
Ответы:
д'Артаньян / О'Брайен
ван Вейден / ди Каприо
Щекочихин-Подъяченский (кстати, тут в транслите тоже будет апостроф)
И. Ньютон и просто Платон
П. Д. Х. Ф. де П. Х. Н. М. де лос Р. С. де ла С. Т. М. П. Руис-и-Пикассо :)
J. Nesbø, наконец
В целом, регулярка для ФИО - это максимум временный инструмент для выковыривания того, что получилось, и доводки руками.
Во-первых, в PHP нет такой функции, есть preg_match(). Во-вторых, если вам нужен результат поиска - нужно кое-что использовать:
if (preg_match('/([а-яёa-z]. *[а-яёa-z]{1,2}. *[а-яёa-z-]+)/iu', $pdfArr, $match)){ echo($match[1]); } |
if (preg_match('/([а-яёa-z]. *[а-яёa-z]{1,2}. *[а-яёa-z-]+)/iu', $pdfArr, $match)){ echo($match[1]); }
В-третьих, лучше использовать preg_match_all(), см. документацию.
- https://www.php.net/manual/ru/function.preg-grep.php
Тоже ни разу не видел
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для построения регулярного выражения, которое будет отсекать ненужное и оставлять только инициалы и фамилию, необходимо учитывать различные варианты написания имени и отчества. В данном случае, мы предполагаем, что инициалы указаны через точку или без нее, а фамилия может состоять из нескольких слов.
Для начала определим, что инициалы могут состоять из одной или двух букв, а фамилия может содержать от одного слова и более. Также, возможно использование дефиса или апострофа в фамилии.
Примеры правильных имен и фамилий:
- И.И. Иванов
- ИИ Иванов
- Иван Иванов-Петров
- И. Иванов-Петров
- И.И. Иванов-Петров
- И. Иванов-Петров-Сидоров
- И.И. Иванов-Петров-Сидоров
- Иван Иванов-Петров-Сидоров
Для создания регулярного выражения, которое будет отсекать ненужное, но оставлять правильные комбинации инициалов и фамилии, можно использовать следующий шаблон:
/^([А-ЯЁ]\.?){1,2}\s[А-ЯЁ][а-яё]+(-[А-ЯЁ][а-яё]+)?$/u
Разберем данное регулярное выражение:
- ^ - начало строки
- ([А-ЯЁ]\.?) - первая группа, которая соответствует одной или двум заглавным буквам, возможно с точкой после первой буквы
- {1,2} - указывает на количество повторений предыдущего выражения (1 или 2 раза)
- \s - символ пробела
- [А-ЯЁ][а-яё]+ - вторая группа, которая соответствует фамилии, начинается с заглавной буквы, за которой следуют одна или более строчных букв
- (-[А-ЯЁ][а-яё]+)? - необязательная группа, которая позволяет учесть наличие дефиса и дополнительного слова в фамилии
- $ - конец строки
- u - модификатор для работы с кириллическими символами
Такое регулярное выражение позволит отфильтровать правильные инициалы и фамилии, отсекая ненужное. При необходимости, можно доработать шаблон для учета других вариантов написания имен и фамилий.