Разбиение строки по заглавному символу 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 обязателен.

→ Ссылка