以下是一个示例字符串:
hello_world_again
所以它将被转换为:
HelloWorldAgain
所以它应该能够删除下划线并将下一个字母大写。第一个字母也应该大写。我发现了这个:preg_replace('/(?<! )(?<!^)[A-Z]/', '_$0', $val)
但现在我想扭转这个过程。非常感谢!谢谢!
答案 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