Как вы делаете preg_replace захватывает прописные буквы (php)? - PullRequest
1 голос
/ 26 марта 2012

У меня есть строка: «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 и здесь на SO, но ничего не нашел.Извиняюсь, если это дуплекс!

Это эквивалентный вопрос SO для Javascript .

Ответы [ 4 ]

8 голосов
/ 27 марта 2012

Я думаю, вы хотите использовать 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
);

Для PHP ниже 5.3

function toUpper($matches) {
    return strtoupper($matches[0]);
}

$result = preg_replace_callback('/(_([a-z]{1}))/', 'toUpper', $subject);
1 голос
/ 30 марта 2012

На данный момент у вас есть несколько хороших ответов;однако я решил опубликовать вариант только для ударов:

[обновлено] отредактированный код откорректирован, чтобы быть более кратким:

<?php

$string = 'Some_strIng_to_caPitÃliZe';
echo mb_convert_case($string, MB_CASE_TITLE, 'UTF-8');
// Some_String_To_Capitãlize

Приведенный выше код учитываетследующее:

  1. Символы Юникода могут быть частью строки;в этом случае 'UTF-8' должна быть безопасной кодировкой:

  2. mb_convert_case с использованием флага MB_CASE_TITLE заботится о словах, которые входят в смешанный регистр, поэтому мы нене нужно вручную нормализовать, а «_» считается границей слова.

  3. Функция mb_convert_case работает с версиями PHP, поскольку 4.3.0

Источник PHP для справки.

1 голос
/ 26 марта 2012

Я думаю, вы хотите, прежде всего, не strtoupper. Это будет использовать только первую букву каждого совпадения, а не все совпадение, как в strtoupper. Я также думаю, что вам нужно переключиться на preg_replace_callback, потому что ваш текущий синтаксис говорит php запустить strtoupper для строки '$ 1' (которая ничего не делает), а затем передать ее в качестве строки замены для использования для ВСЕХ совпадений сделал. Что даст вам точно такой же вывод, как ввод.

Попробуйте вместо этого:

<?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
);
?>
1 голос
/ 26 марта 2012

Попробуйте добавить букву «e» (что означает eval) в качестве модификатора к вашему регулярному выражению.

$result = preg_replace("/(_([a-z]{1}))/e" , "strtoupper(\\1)" , $subject);
...