Разбиение строки по заглавному символу php
помогите составить правильно регулярку. Нужна обработка строки как латиницей так и кириллицей, как обьединить [A-Z][^A-Z] и [А-Я][^А-Я]?
$fio = 'YusifovaVusale';
$res = array();
preg_match_all('/[A-Z][^A-Z]*/',$fio,$res,PREG_SET_ORDER);
print_r ($res);
$fio = 'ЮзифоваВусаля';
$res = array();
preg_match_all('/[А-Я][^А-Я]*/',$fio,$res,PREG_SET_ORDER);
print_r ($res);
Ответы (3 шт):
Автор решения: Алексей Шиманский
→ Ссылка
Для мультибайтных строк нужно поставить модификатор uв конце http://phpweb.hostnet.com.br/manual/ru/reference.pcre.pattern.modifiers.php:
$fio = 'ЮзифоваВусаля';
$res = array();
preg_match_all('/[А-Я][^А-Я]*/u',$fio,$res,PREG_SET_ORDER);
print_r ($res);
Автор решения: Anton Shchyrov
→ Ссылка
Просто объединить
preg_match_all('/[А-ЯA-Z][^А-ЯA-Z]*/',$fio,$res,PREG_SET_ORDER);
Автор решения: Wiktor Stribiżew
→ Ссылка
Используйте preg_split:
$fio = 'YusifovaVusaleЮзифоваВусаля';
print_r( preg_split('~(?!^)(?=\p{Lu})~u', $fio) );
// -> Array
// (
// [0] => Yusifova
// [1] => Vusale
// [2] => Юзифова
// [3] => Вусаля
// )
См. пример работы кода.
Подробности:
(?!^)- блок предварительного просмотра вперёд, запрещающий совпадение в начале строки(?=\p{Lu})- блок предварительного просмотра вперёд, требующий наличия заглавной буквы справа.
Модификатор u обязателен.