2013-08-13 2 views
2

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

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

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

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 

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

+0

* «Я понятия не имею, почему это происходит ...» * - Смотрите здесь: '' strtoupper («$ 0») ', это происходит потому, что вы так написали. и больше не используйте модификатор '/ e' (eval). вместо этого используйте обратный вызов. Этот модификатор теперь устарел, и он имеет серьезные последствия для безопасности, поэтому это действительно хорошее предложение для улучшения вашего кода. – hakre

+0

Touche, мой хороший сэр – Gramps

+0

Вам не хватает трех закрывающих круглых скобок. – ironcito

ответ

7

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

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

It что каждому нижнему регистру предшествует пробел (или начало предложения) с помощью lookbehind assertion, прежде чем он будет изменен на верхний регистр.

3

Вы, вероятно, ищет ucwords вместо (Demo):

$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" 
+0

Это работает ... однако код должен был иметь дело с такими вещами, как имена (например, O'Reilly) и номерами (например, 2-й). – Gramps

+0

@SlothLordKyle: Лучше напишите, что в вашем вопросе иначе никто не знает. Я также отредактировал ваш заголовок, уточню, добавьте контекст (например, mysql) в вопросе (а не заголовок), когда вы объясните, что вы делаете в этой проблеме. Удачи и удачи! – hakre

Смежные вопросы