preg_replace一个字符串,用于大写下划线后面的每个单词

时间:2013-10-03 21:57:32

标签: php regex preg-replace

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

所以它将被转换为: HelloWorldAgain

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

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

4 个答案:

答案 0 :(得分:5)

单独的正则表达式在这里不起作用。但是,您可以改为使用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或更高版本中,也可以使用anonymous function

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

此外,如果您忽略有关e modifier的所有警告和注意事项,这也会有效:

$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)

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

 #  (?:^|_)(.)

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

编辑:如果遇到第一个字符不是alpha的情况。 在替换中,如果它有长度,则将$ 2转换为upper,然后catenate $ 1和$ 2
这会删除所有_,并留下任何标点符号。

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

mov DWORD PTR var$[rsp], 123