1

特殊文字を含む可能性のある文字列の最初の文字を大文字にしたいのです(これが、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')さまざまな組み合わせを作成しましたが、適切な正規表現が見つかりませんでした。

4

1 に答える 1

2

これは、あなたa-zがéと一致しないためです。Unicode文字を含む正規表現を作成するのは難しい場合があります。

コードからは、文字列内の単語の量に関係なく、最初の文字のみが大文字になります。もしそうなら、これを行うだけです:

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

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

関数はmb_*特殊文字を正しく処理する必要があります。


以下のコメントに基づいて、私はあなたのジレンマを理解しています。その場合、正規表現を使用できますが、正しい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];
}
于 2012-06-21T07:37:15.493 に答える