php регулярка - вывести имя

126
11 июня 2019, 22:00

знатоки!

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

Answer 1

Если нужно только имя, то можно фамилию слить с начальными символами и если что, раскрасить фамилию уже второй регуляркой или сабстрингом, примерно так:

$re = '/^(.+)\s+(\S+)\s+(\S+)$/m';
$str = 'хххх Иванов Иван Иванович
Иванов Иван Иванович';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Answer 2
'/^.*?\h+\K[А-Яа-я]+(?=\h+[А-Яа-я]+$)/m'

См. демо регулярного выражения

Answer 3

Если перед Ф.И.О находятся только числа (или ничего), то можно их обрезать одной строкой кода:

$str = '123 Иванов Иван Иванович';
echo preg_replace('~(?:\d+\h)?(?=(?:\pL+\h*)+)~u', '', $str);

Результат:

Иванов Иван Иванович

Смотреть демо

Answer 4

Найти индекс Первой буквы в верхнем регистре и с нее сделать substr

$a = "123443 Вася";
$upperIndex = -1;
for(int $i = 0; $i < strlen($a); $i++)
{
    if(ctype_upper($a[$i]))
    {
        $upperIndex = i;
        break;
    }
}
if( $upperIndex != -1 )
{
    $userName = substr($a, $upperIndex);
}
Answer 5

Как вариант необходимый результат можно получить с помощью sql-запроса. Я не уверен, что это вариант будет самый производительный, однако это вариант

SELECT REGEXP_REPLACE(`name`, '^[^ ]+', '') as name FROM `table` WHERE `name` REGEXP '[^ ]+ Иванов Иван Иванович'

Замените "name" и "table" на свои. Кстати, если вы скажите, что вместо хххх может быть, конкретизировать регулярное выражение. Например, если 4 цифры:

SELECT REGEXP_REPLACE(`name`, '^[0-9]{4}', '') as name FROM `table` WHERE `name` REGEXP '[0-9]{4} Иванов Иван Иванович'
Answer 6

Можно просто вывести предпоследнее слово

echo reset( array_slice( explode(" ", $str), -2, 1));

Или более универсальный вариант

$str = '123 Иванов Иван Иванович';
$str=preg_replace('/[^А-Яа-я \-]/ui', '', $str); # убераем всё кроме букв, пробелов, тире
$fio=explode(' ',trim($str)); # получаем массив [Ф,И,O]
echo $fio[1]; # выводим имя
READ ALSO
ZF3: Как в Zend Framefork-е зарегистрировать Doctrine Type?

ZF3: Как в Zend Framefork-е зарегистрировать Doctrine Type?

Как известно Doctrine не понимает тип enum MySQLПри генерации сущностей выходит ошибка:

104
telegram Webhooks никак не работает?

telegram Webhooks никак не работает?

Несколько суток возни, 3 разных VPS, на каждом 3 разных сертификата - Comodo, opensl, LE, - ничего

142
Чтение Бинарного файла . Задача С++

Чтение Бинарного файла . Задача С++

Есть задание по С++: https://drivegoogle

138
Сортировка multiset

Сортировка multiset

Есть multiset<multiset<int>> cnt; Хочу отсортировать cnt по последнему элементу multiset-овКак это сделать?

129