Pytanie w sprawie preg-replace-callback, php, regex – Używanie regex z preg_replace_callback

1

Pierwszą literę ciągu, który może mieć specjalne znaki, chciałbym wpisać wielką literą (dlatego ucfirst nie jest tutaj ważny). Mam następny kod:

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

który zwraca 'éSta', ale oczekiwano 'Ésta' ... Myślę, że moim problemem jest wzorzec, którego używam, ale stworzyłem różne kombinacje (np.$pattern = '/\pL/u'), ale nie znajduję dobrego wyrażenia regularnego. Czy ktoś może mi pomóc? Dzięki!

Twoja odpowiedź

1   odpowiedź
2

a-z nie pasuje é. Zapisanie wyrażenia regularnego w celu objęcia znaków Unicode może być trudne.

Z twojego kodu będzie pisana wielka pierwsza litera, bez względu na ilość słów w ciągu. Jeśli tak, po prostu zrób to:

$string = 'ésta';
$ucstring = ucphrase($string);

function ucphrase($word) {
  return mb_strtoupper(mb_substr($word, 0, 1)) . mb_substr($word, 1);
}

Themb_* funkcje powinny poprawnie obsługiwać znaki specjalne.

Na podstawie poniższego komentarza rozumiem twój dylemat. W takim przypadku możesz użyć wyrażenia regularnego, ale z poprawnymi selektorami Unicode

$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];
}
Powyższy kod zadziała¿"ésta iésta Elliot Chance
Moim problemem jest to, że nie zawsze jest to pierwsza litera, która musi być pisana wielką literą, ponieważ mój ciąg może być taki jak „¿” ésta ”? i chcę, aby moja funkcja powróciła „É„ Ésta ”? jprog
Dziękuje bardzo!! ;) jprog

Powiązane pytania