你如何使preg_replace捕获大写(PHP)?

时间:2012-03-26 19:51:42

标签: php string preg-replace

我有一个字符串:'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手册页,在这里,但没有找到任何结果。抱歉,如果这是一个复制品!

This is the equivalent SO question for Javascript

4 个答案:

答案 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

以下的PHP
function 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

以上代码考虑以下内容:

  1. Unicode字符可能是字符串的一部分;在这种情况下,'UTF-8'应该是安全的编码:

  2. mb_convert_case使用标记MB_CASE_TITLE处理混合大小写的单词,因此我们不需要手动规范化,“_”被视为单词边界。

  3. mb_convert_case函数适用于PHP版本4.3.0

  4. PHP Source供参考。