【问题标题】:How to CamelCase an string value even if string separator is null?即使字符串分隔符为空,如何将字符串值驼峰化?
【发布时间】:2017-03-13 16:49:00
【问题描述】:

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

注意:如果您知道任何具有此类功能的字符串操作类|包,请告诉我,以免我重新发明轮子!

【问题讨论】:

  • stringwithoutseparator 变成了什么?
  • @chris85 输入与$str2 相同的路径,输出应为Stringwithoutseparator
  • 除了第一个字母外,它主要工作,但你没有检查错误,因为你的回调应该像[$this,'removeCharacterAndCapitalize']一样被引用

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


【解决方案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

【讨论】:

    【解决方案2】:

    使用

    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 和字符串的开头。两者都应该有捕获组,以便能够更改大小写并在removeCharacterAndCapitalize 中返回正确的字符串。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2015-12-28
      • 2011-03-06
      • 1970-01-01
      • 2018-09-10
      相关资源
      最近更新 更多