nastya97core
@nastya97core
Начинающий программист

Как из строки достать ФИО, г.р. и номер?

Здравствуйте. Есть вот такая строка:
Иванов Иван Иванович 01.01.1970 353

Подскажите пожалуйста, как можно отдельно достать данные в эти переменные?
$lastname
$firstname
$secondname
$birthdate
$number

Отчества может не быть, поэтому explode мне не совсем подходит... Так бы с радостью его использовала.

Вообще наверное можно было бы сделать explode, а потом просто проверять является ли 3 или 4 элемент массива датой, а number получать через end($array). Я просто не знаю, что будет быстрее: regExp или вот такой костыль.
  • Вопрос задан
  • 464 просмотра
Решения вопроса 3
miraage
@miraage
Старый прогер
https://regex101.com/r/DrokUH/1

^(\w+\s\w+(?:\s\w+)?)\s(\d{2}\.\d{2}\.\d{4})\s(\d+)$
Ответ написан
Комментировать
@i1yas
Я бы в таком случае использовал regexp, но не из-за производительности. Возня с массивом будет достаточно громоздкой, никакого матчинга по сути не будет, только обработка опционального отчества.
С регуляркой можно проверять дополнительно дату и число:
$str = 'Иванов Иван Иванович 01.01.1970 353';
preg_match('/(\w*)\s(\w*)\s?(\w*)\s(\d\d\.\d\d.\d{4})\s(\d+)/u', $str, $match);
print_r($match);
Ответ написан
@IS-Builder
~ PHP-8 & REGEXP - This is a really powerful kit ~
Анастасия, если нужно по переменным разложить, с учётом необязательного отчества, то можно так:
spoiler
//$str = 'Иванов Иван Иванович 01.01.1970 353';
$str = 'Иванов Иван 01.01.1970 353';

extract( splitLineBySpace($str) );
var_dump($lastname, $firstname, $secondname, $birthdate, $number);


function splitLineBySpace(string $str): array 
{
    $lastname = $firstname = $secondname = $birthdate = $number = '';
    $patt = '~(\S+)\h(\S+)(?:\h(\S+))?\h((?:\d\d\.){2}\d{4})\h(\d+)~';

    if (preg_match($patt, $str, $arr)) {
        if (count($arr) == 6) {
            [, $lastname, $firstname, $secondname, $birthdate, $number] = $arr;
        } else {
            [, $lastname, $firstname, $birthdate, $number] = $arr;
        }
    }
    return compact('lastname', 'firstname', 'secondname', 'birthdate', 'number');
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы