pre_replace一个字符串,将下划线后面的每个单词大写


pre_replace a string to capitalize each word that follows an underscore

下面是一个示例字符串: hello_world_again

因此,它将转换为: HelloWorldAgain

因此,它应该能够删除下划线并将下一个字母大写。第一个字母也应大写。我发现这个:preg_replace('/(?<! )(?<!^)[A-Z]/', '_$0', $val)

但现在我想扭转这个过程。非常感谢您的帮助!谢谢!

仅使用正则表达式在这里不起作用。但是,您可以改用preg_replace_callback

$val = 'hello_world_again';
function match_toupper($m) {
    return strtoupper($m[1]);
}
$val = preg_replace_callback('/(?:^|_)([a-z])/', 'match_toupper', $val);
echo $val; // HelloWorldAgain

在 PHP 5.3 或更高版本中,也可以使用匿名函数:

$val = 'hello_world_again';
$val = preg_replace_callback('/(?:^|_)([a-z])/', 
    function ($m) {
        return strtoupper($m[1]);
    }, $val);
echo $val; // HelloWorldAgain

此外,如果您忽略有关 e 修饰符的所有警告和警告,这也将起作用:

$val = 'hello_world_again';
$val = preg_replace('/(?:^|_)([a-z])/e', 'strtoupper($1)', $val);
echo $val; // HelloWorldAgain

这是另一种完全避免正则表达式的解决方案:

$val = 'hello_world_again';
$val = implode('', array_map(ucfirst, explode('_', $val)));
echo $val; // HelloWorldAgain

只需找到使用它,使用回调替换将 $1 转换为上限

 #  (?:^|_)(.)
 (?: ^ | _ )
 ( . )             # (1)

编辑:如果您遇到第一个字符不是字母的情况。在替换中,如果它有长度,则将 $2 转换为上部,然后连接 $1 和 $2
这将去除所有 _,并保留任何标点符号。

 # (?i)(?:^|_)'s*([^a-z's]*)([a-z])?
 (?i)
 (?: ^ | _ )
 's* 
 ( [^a-z's]* )     # (1)
 ( [a-z] )?        # (2)

从 PHP 5.4.32、5.5.16 开始,您可以使用str_replace('_','',ucwords($str,'_'));

我认为这是最简单的方法。 从 PHP 5.0 开始,ucword() 可用于将字符串的每个单词大写。

$val = 'hello_world_again';
$val = str_replace('_','',ucwords($val,'_'));
echo $val; //HelloWorldAgain