Как правильно построить регулярное выражение И. О. Фамилия, отсекая ненужное?

Ссылка скопирована
PHP
20 января 2026 1 ответ

Осуществляю поиск в файле формата И. О. Фамилия (на русском или английском). Так как текст берётся из 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
Роман IT Ответ

Для построения регулярного выражения, которое будет отсекать ненужное и оставлять только инициалы и фамилию, необходимо учитывать различные варианты написания имени и отчества. В данном случае, мы предполагаем, что инициалы указаны через точку или без нее, а фамилия может состоять из нескольких слов.

Для начала определим, что инициалы могут состоять из одной или двух букв, а фамилия может содержать от одного слова и более. Также, возможно использование дефиса или апострофа в фамилии.

Примеры правильных имен и фамилий:
- И.И. Иванов
- ИИ Иванов
- Иван Иванов-Петров
- И. Иванов-Петров
- И.И. Иванов-Петров
- И. Иванов-Петров-Сидоров
- И.И. Иванов-Петров-Сидоров
- Иван Иванов-Петров-Сидоров

Для создания регулярного выражения, которое будет отсекать ненужное, но оставлять правильные комбинации инициалов и фамилии, можно использовать следующий шаблон:

/^([А-ЯЁ]\.?){1,2}\s[А-ЯЁ][а-яё]+(-[А-ЯЁ][а-яё]+)?$/u

/^([А-ЯЁ]\.?){1,2}\s[А-ЯЁ][а-яё]+(-[А-ЯЁ][а-яё]+)?$/u

Разберем данное регулярное выражение:
- ^ - начало строки
- ([А-ЯЁ]\.?) - первая группа, которая соответствует одной или двум заглавным буквам, возможно с точкой после первой буквы
- {1,2} - указывает на количество повторений предыдущего выражения (1 или 2 раза)
- \s - символ пробела
- [А-ЯЁ][а-яё]+ - вторая группа, которая соответствует фамилии, начинается с заглавной буквы, за которой следуют одна или более строчных букв
- (-[А-ЯЁ][а-яё]+)? - необязательная группа, которая позволяет учесть наличие дефиса и дополнительного слова в фамилии
- $ - конец строки
- u - модификатор для работы с кириллическими символами

Такое регулярное выражение позволит отфильтровать правильные инициалы и фамилии, отсекая ненужное. При необходимости, можно доработать шаблон для учета других вариантов написания имен и фамилий.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно