preg_replace чтобы заглавная буква после цитаты - PullRequest
17 голосов
/ 14 апреля 2010

У меня есть такие имена:

$str = 'JAMES "JIMMY" SMITH'

Я запускаю strtolower, затем ucwords, что возвращает:

$proper_str = 'James "jimmy" Smith'

Я бы хотел использовать заглавную букву второй буквы, в которой первая буква - двойная кавычка. Вот регулярное выражение. Похоже, strtoupper не работает - регулярное выражение просто возвращает неизмененное исходное выражение.

$proper_str = preg_replace('/"([a-z])/',strtoupper('$1'),$proper_str);

Есть какие-нибудь подсказки? Спасибо !!

Ответы [ 8 ]

34 голосов
/ 14 апреля 2010

Вероятно, лучший способ сделать это - использовать preg_replace_callback():

$str = 'JAMES "JIMMY" SMITH';
echo preg_replace_callback('!\b[a-z]!', 'upper', strtolower($str));

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

Вы можете использовать флаг e (eval) на preg_replace(), но я обычно советую против этого. Особенно когда речь идет о внешнем входе, он потенциально чрезвычайно опасен.

20 голосов
/ 29 января 2013

Использовать preg_replace_callback - Но вам не нужно добавлять дополнительную именованную функцию, лучше используйте анонимную функцию.

$str = 'JAMES "JIMMY" SMITH';
echo preg_replace_callback('/\b[a-z]/', function ($matches) {
     return strtoupper($matches[0]);
}, strtolower($str));

Использование /e устарело с PHP 5.5 и не работает в PHP 7

20 голосов
/ 14 апреля 2010

Используйте модификатор e для оценки замещения:

preg_replace('/"[a-z]/e', 'strtoupper("$0")', $proper_str)

Где $0 содержит совпадение всего шаблона, поэтому " и строчная буква. Но это не имеет значения, поскольку " не изменяется при отправке через strtoupper.

1 голос
/ 03 декабря 2018

Полное решение не становится проще / легче для чтения, чем это ...

Код: https://3v4l.org/rrXP7

$str = 'JAMES "JIMMY" SMITH';
echo ucwords(strtolower($str), ' "');

Выход:

James "Jimmy" Smith

Это просто вопрос объявления двойных кавычек и пробелов в качестве разделителей в вызове ucwords().

0 голосов
/ 27 апреля 2017
echo ucwords(mb_strtolower('JAMES "JIMMY" SMITH', 'UTF-8'), ' "'); // James "Jimmy" Smith

ucwords() имеет второй параметр разделителя, дополнительные разделители содержат символы разделителя слов. Используйте пробел '' и " в качестве разделителя, и "Джимми" будет правильно распознан.

0 голосов
/ 30 ноября 2013

Вы должны сделать это:

$proper_str = 
    preg_replace_callback(
        '/"([a-z])/',
        function($m){return strtoupper($m[1]);},
        $proper_str
);

Вы не должны использовать "eval ()" по соображениям безопасности.

В любом случае, модификатор паттерна "e" устарел. См .: Документация PHP .

0 голосов
/ 03 января 2013

Я делаю это без регулярных выражений, как часть моей пользовательской функции ucwords(). Предполагая, что в строке появляется не более двух кавычек:

$parts = explode('"', $string, 3); 
if(isset($parts[2])) $string = $parts[0].'"'.ucfirst($parts[1]).'"'.ucfirst($parts[2]);            
else if(isset($parts[1])) $string = $parts[0].'"'.ucfirst($parts[1]);   
0 голосов
/ 14 апреля 2010

Нечто подобное может сработать:

preg_replace("/(\w+)/e", "ucwords(strtolower('$1'))", $proper_str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...