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-zwill 不匹配 é。编写一个包含 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 回答