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

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

$string = 'ésta';
$pattern = '/^([^a-z]*)([a-z])/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'), но я не нашел хорошего регулярного выражения.


person jprog    schedule 21.06.2012    source источник


Ответы (1)


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

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

$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];
}
person Elliot Chance    schedule 21.06.2012
comment
Моя проблема в том, что это не всегда первая буква, которую я должен сделать заглавной, потому что моя строка может быть чем-то вроде «¿ésta?» и я хочу, чтобы моя функция возвращала '¿Ésta?' - person jprog; 21.06.2012
comment
Большое большое спасибо!! ;) - person jprog; 21.06.2012