我有一个字符串:'Some_string_to_capitalize',我想将其转换为'Some_String_To_Capitalize'。我试过了:
$result = preg_replace( '/(_([a-z]{1}))/' , strtoupper('$1') , $subject )
和
$result = preg_replace( '/(_([a-z]{1}))/' , "strtoupper($1)" , $subject )
我查看了php手册页,在这里,但没有找到任何结果。抱歉,如果这是一个复制品!
答案 0 :(得分:8)
我认为你想使用preg_replace_callback
:
在PHP 5.3 +
中<?php
$subject = 'Some_string_to_capitalize';
$result = preg_replace_callback(
'/(_([a-z]{1}))/',
function ($matches) {
return strtoupper($matches[0]);
} ,
$subject
);
对于 5.3
以下的PHPfunction toUpper($matches) {
return strtoupper($matches[0]);
}
$result = preg_replace_callback('/(_([a-z]{1}))/', 'toUpper', $subject);
答案 1 :(得分:1)
尝试在正则表达式中添加字母“e”(表示eval)作为修饰符。
$result = preg_replace("/(_([a-z]{1}))/e" , "strtoupper(\\1)" , $subject);
答案 2 :(得分:1)
我认为你想要ucfirst而不是strtoupper。这将只占用每场比赛的第一个字母,而不是像strtoupper那样的整个比赛。我也认为你需要切换到preg_replace_callback,因为你当前的语法告诉php在字符串'$ 1'上运行strtoupper(什么都不做),然后将其作为替换字符串传递给所有匹配项制作。这将为您提供与输入完全相同的输出。
请改为尝试:
<?php
preg_replace_callback(
'/(_([a-z]{1}))/',
create_function(
// single quotes are essential here,
// or alternative escape all $ as \$
'$matches',
'return ucfirst($matches[0]);'
),
$subject
);
?>
答案 3 :(得分:1)
到目前为止,你已经发布了一些很好的答案;但是,我以为我会发布一个变种只是为了踢:
[已更新] 修改后的代码剪片更加简洁:
<?php
$string = 'Some_strIng_to_caPitÃliZe';
echo mb_convert_case($string, MB_CASE_TITLE, 'UTF-8');
// Some_String_To_Capitãlize
以上代码考虑以下内容:
Unicode字符可能是字符串的一部分;在这种情况下,'UTF-8'
应该是安全的编码:
mb_convert_case
使用标记MB_CASE_TITLE
处理混合大小写的单词,因此我们不需要手动规范化,“_”被视为单词边界。
mb_convert_case
函数适用于PHP版本4.3.0
PHP Source供参考。