Использование регулярного выражения с preg_replace_callback

Я хотел бы загладить первую букву строки, которая может содержать специальные символы (вот почему ucfirst здесь недействительна). У меня есть следующий код:

$string = 'ésta'; $pattern = '/^([^az]*)([az])/i'; $callback_fn = 'process'; echo preg_replace_callback($pattern, $callback_fn, $string); function process($matches){ return $matches[1].strtoupper($matches[2]); } 

который возвращает «éSta», но ожидалось «Ésta» … Я думаю, что моя проблема – это шаблон, который я использую, но я сделал разные комбинации (например, $pattern = '/\pL/u' ), но я не найти хорошее регулярное выражение. Может кто-нибудь мне помочь? Благодаря!

Это связано с тем, что ваш az не будет соответствовать. Написание регулярного выражения для включения символов Юникода может быть затруднено.

Из вашего кода он будет использовать только первую букву, независимо от количества слов в вашей строке. Если так, просто выполните это:

 $string = 'ésta'; $ucstring = ucphrase($string); function ucphrase($word) { return mb_strtoupper(mb_substr($word, 0, 1)) . mb_substr($word, 1); } 

Функции mb_* должны правильно обрабатывать ваши специальные символы.


Основываясь на вашем комментарии ниже, я понимаю вашу дилемму. В этом случае вы можете использовать свое регулярное выражение, но с правильными юникодными селекторами

 $string = 'ésta'; $pattern = '/(\p{L})(.+)/iu'; $callback_fn = 'process'; echo preg_replace_callback($pattern, $callback_fn, $string); function process($matches){ return mb_strtoupper($matches[1], 'UTF-8') . $matches[2]; }