如果字符串分隔符为空,如何CamelCase字符串值?

时间:2016-10-31 15:08:08

标签: php regex preg-replace preg-replace-callback

我需要将给定的字符串值(带或不带分隔符)转换为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!

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

2 个答案:

答案 0 :(得分:3)

使用

watchTransition

请参阅PHP demo

由于您需要考虑可选元素,因此您需要为这两种方案使用适当的模式。如果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]); } } 未通过,$re = $character == null ? '/^([a-zA-Z])/' : '/(?:^|' . $character . ')([a-zA-Z])/';将指定第一个/^([a-zA-Z])/正则表达式。第二个将匹配$char和字符串的开头。两者都应该让捕获组能够更改大小写并在$char内返回正确的字符串。

至于在班级中使用回调本身,您需要检查preg_replace_callback requires argument 2 to be a valid callback… Stuck!。必须在removeCharacterAndCapitalize中将其定义为array('UtilString', 'removeCharacterAndCapitalize')

答案 1 :(得分:1)

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