знатоки!
Такой вопрос - имеется запись в базе такого формата "хххх Иванов Иван Иванович" - необходимо вытащить имя, проблема в том, что в некоторых случаях запись бывает такого формата "Иванов Иван Иванович", т.е. без номера вначале, подскажите, пожалуйста, универсальное решение задачи
Если нужно только имя, то можно фамилию слить с начальными символами и если что, раскрасить фамилию уже второй регуляркой или сабстрингом, примерно так:
$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);
'/^.*?\h+\K[А-Яа-я]+(?=\h+[А-Яа-я]+$)/m'
См. демо регулярного выражения
Если перед Ф.И.О находятся только числа (или ничего), то можно их обрезать одной строкой кода:
$str = '123 Иванов Иван Иванович';
echo preg_replace('~(?:\d+\h)?(?=(?:\pL+\h*)+)~u', '', $str);
Результат:
Иванов Иван Иванович
Смотреть демо
Найти индекс Первой буквы в верхнем регистре и с нее сделать 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);
}
Как вариант необходимый результат можно получить с помощью 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} Иванов Иван Иванович'
Можно просто вывести предпоследнее слово
echo reset( array_slice( explode(" ", $str), -2, 1));
Или более универсальный вариант
$str = '123 Иванов Иван Иванович';
$str=preg_replace('/[^А-Яа-я \-]/ui', '', $str); # убераем всё кроме букв, пробелов, тире
$fio=explode(' ',trim($str)); # получаем массив [Ф,И,O]
echo $fio[1]; # выводим имя
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как известно Doctrine не понимает тип enum MySQLПри генерации сущностей выходит ошибка:
Несколько суток возни, 3 разных VPS, на каждом 3 разных сертификата - Comodo, opensl, LE, - ничего
Есть multiset<multiset<int>> cnt; Хочу отсортировать cnt по последнему элементу multiset-овКак это сделать?