2012-06-21 3 views
1

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

$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]); 
} 

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

ответ

2

Это потому, что ваш 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]; 
} 
+0

Моя проблема заключается в том, что это не всегда первое письмо которым я должен извлечь выгоду, потому что моя строка может быть что-то вроде «¿„Эста“? ' и я хочу, чтобы моя функция вернула «¿« Ésta »? – jprog

+0

Приведенный выше код будет работать для '¿'ésta' и' ésta' –

+0

Спасибо, ОЧЕНЬ много !!;) – jprog

Смежные вопросы