Как CamelCase строковое значение, даже если разделитель строк равен нулю?

Мне нужно преобразовать данное значение строки (с разделителем или без) в 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 ответа

Решение

Использование

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

Поскольку вам необходимо учитывать необязательный элемент, вам необходимо использовать соответствующие шаблоны для обоих сценариев. $re = $character == null ? '/^([a-zA-Z])/' : '/(?:^|' . $character . ')([a-zA-Z])/'; укажу первый /^([a-zA-Z])/ регулярное выражение в случае, если $char не прошло. Второй будет соответствовать на $char и в начале строки. У обоих должна быть группа захвата, чтобы иметь возможность изменить регистр и вернуть правильную строку внутри removeCharacterAndCapitalize,

А что касается использования самого обратного вызова в вашем классе, вам нужно проверить, что preg_replace_callback требует, чтобы аргумент 2 был действительным обратным вызовом... Застрял!, Это должно быть определено как array('UtilString', 'removeCharacterAndCapitalize') в preg_replace_callback,

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
Другие вопросы по тегам