即使字符串分隔符为空,如何对字符串值进行 CamelCase?

How to CamelCase an string value even if string separator is null?

我需要将给定的字符串值(带或不带分隔符)转换为 CamelCase 字符串。到目前为止,这就是我正在做的事情:

class UtilString
{
    public function stringToCamelCase($string, $character = null)
    {
        return preg_replace_callback("/{$character}[a-zA-Z]/", 'removeCharacterAndCapitalize', $string);
    }

    private function removeCharacterAndCapitalize($matches)
    {
        return strtoupper($matches[0][1]);
    }
}

$str1 = 'string_with_separator';
$str2 = 'string';

$test1 = (new UtilString())->stringToCamelCase($str1, '_'); 
$test2 = (new UtilString())->stringToCamelCase($str2);

上面的代码输出是:

$test1 = 'string_with_separator'; 
$test2 = 'string';

我希望他们是:

$test1 = 'StringWithSeparator'; 
$test2 = 'String';

怎么样?我做错了什么以及如何解决?我正在使用 PHP 5.5.x!

注意:如果您知道任何字符串操作class|具有此类功能的程序包,请告诉我,这样我就不会重新发明轮子了!

使用

class UtilString
{
    public function stringToCamelCase($string, $character = null)
    {
        $re = $character == null ? '/^([a-zA-Z])/' : '/(?:^|' . $character . ')([a-zA-Z])/';
        return preg_replace_callback($re, array('UtilString', 'removeCharacterAndCapitalize'), $string);
    }

    private function removeCharacterAndCapitalize($matches)
    {
        return strtoupper($matches[1]);
    }
}

PHP demo

由于您需要考虑一个可选元素,因此您需要为这两种情况使用适当的模式。 $re = $character == null ? '/^([a-zA-Z])/' : '/(?:^|' . $character . ')([a-zA-Z])/'; 将指定第一个 /^([a-zA-Z])/ 正则表达式,以防 $char 未通过。第二个将匹配 $char 和字符串的开头。两者都应该有捕获组能够改变大小写和 return removeCharacterAndCapitalize.

中的正确字符串

关于在 class 中使用回调本身,您需要检查 preg_replace_callback requires argument 2 to be a valid callback… Stuck!。它必须在 preg_replace_callback.

中定义为 array('UtilString', 'removeCharacterAndCapitalize')

PHP 有一个名为 ucwords() 的函数,可以将每个单词的第一个字符大写。它需要第二个参数作为分隔符。

请注意 ucwords() 不会 删除分隔符。所以你需要自己做,例如str_replace。这是一个简单的例子:

function stringToCamelCase($string) {

    $delimiters = array('_');

    $string = ucwords($string, implode('', $delimiters));
    $string = str_replace($delimiters, '', $string);

    return $string;
}

$my_string = 'string_with_separator';
echo stringToCamelCase($my_string);

输出:

StringWithSeparator