Вопрос по pcre, regex, php – Прописать каждую первую букву слова с preg_replace

2

Итак, у меня есть несколько предложений, которые я вставляю в базу данных с некоторыми процессами автокоррекции. Следующее предложение:

$sentence = "Is this dog your's because it can't be mine";

И следующий код, чтобы заглавные буквы каждого слова, но убедитесь, что это нет сокращений (например, n 'т):

str_replace(
    "'S", "'s", preg_replace(
       "/(\w+)n'T?/", "$1n't", (
           preg_replace(
              "/\b[a-z]/e", 
              'strtoupper("$0")', 
              ucwords($sentence)
           )
       )
   )
);

При отражении, результат выглядит следующим образом:

Is This Dog Your's Because It Can't Be Mine

Это то, что я хочу сделать, однако, что он вводит в мою базу данных MySQL:

Is This Dog Your's Because It Can'T Be Mine

Я понятия не имею, почему это происходит ... Я предполагаю, что я что-то напутал ".

Вы'отсутствует как три закрывающие скобки. ironcito
@ironcito - Извините, мой пример строки неу меня есть))) но это в самом кодем с помощью. Gramps
Прикоснись, мой хороший сэр Gramps
Понятия не имею, почему это происходит ... » - хорошо смотрите здесь:'strtoupper("$0")'бывает потому что ты так написал. и не надот использовать/e модификатор (eval) больше вместо этого используйте обратный вызов. Этот модификатор устарел и имеет серьезные последствия для безопасности, так что это действительно хорошее предложение для улучшения вашего кода. hakre

Ваш Ответ

2   ответа
7

конечно, использоватьucwords(), но это то, как вы бы сделали это с помощью регулярного выражения:

echo preg_replace_callback('/(?<=\s|^)[a-z]/', function($match) {
    return strtoupper($match[0]);
}, $sentence);

Это гарантирует, что каждому символу в нижнем регистре предшествует пробел (или начало предложения), используя lookbehindутверждение, перед этим's изменилось на верхний регистр.

3

наверное, ищетеucwords вместо (демонстрация):

$sentence = "Is this dog your's because it can't be mine";

echo ucwords($sentence); # Prints "Is This Dog Your's Because It Can't Be Mine"
@SlothLordKyle: лучше напиши это в своем вопросе, иначе никто не знает. Я также отредактировал ваш заголовок, спросите больше по существу, добавьте контекст (например, mysql) в вопрос (а не заголовок), когда вы объясните, что вы 'Вы столкнулись с этой проблемой. Удачи и удачи! hakre
Это работает ... однако код должен иметь возможность иметь дело с такими вещами, как имена (например, O 'Рейли) и цифры (например, 2-й). Gramps

Похожие вопросы