Проверьте, есть ли в слове несколько заглавных букв, и измените только те слова, которые имеют один и только верхний регистр (и будут первой буквой).

#php #uppercase #lowercase

Вопрос:

Мой код до сих пор:

 $text = 'Herman Archer LIVEs in neW YORK'; $oldWords = explode(' ', $text);  $newWords = array();  $counter = 0;  foreach ($oldWords as $word) {  for($k=0;$klt;strlen($word);$k  )  $counter = 0;  if ($word[k] == strtoupper($word[$k]))  $counter=$counter 1;  if($countergt;1)  $word = strtolower($word);  if($counter == 1)  $word = ucfirst(strtolower($word));  else $word = strtolower($word);  echo $word."lt;brgt;"; }  

Результат:

Герман
Арчер
Живет
В
Нью
— Йорке

Ожидаемый результат:

Герман Арчер живет в Нью — Йорке

Комментарии:

1. Примечание: Вам следует добавить несколько фигурных скобок { и } / или позаботиться о отступе. Здесь легко прочесть, что if операторы находятся во втором цикле…

2. Кроме того, in $word[k] k это неопределенная константа, не $k .

3. В настоящее время if операторы-находятся после вашего for цикла -, а не в нем (так как вы все еще пропускаете { } его ). Это означает, что $word[k] (на что уже указывалось как на опечатку) будет проверяться только последний символ для каждого слова. Единственное, что в настоящее время происходит в вашем for цикле,- это то, что вы настраиваетесь $counter = 0 на каждой итерации, и ничего больше. Я предполагаю, что это не входит в ваши намерения?

4. @Baracuda078 использование регулярных выражений для строковых операций является излишним

5. @DarkBee в последний раз, когда я проверял, регулярное выражение используется только для строковых операций

Ответ №1:

Если вы хотите использовать встречный подход, вы можете использовать что-то вроде следующего

 lt;?php   $text = 'Herman Archer LIVEs in A neW YORK'; $words = explode(' ', $text);   foreach($words as amp;$word) {  $counter = 0;  for($i = 1; $i lt;= strlen($word);$i  ) {  if (strtoupper($word[$i]) == $word[$i]) $counter  ;  if ($counter == 2) break;  }  if ($counter == 2) $word = strtolower($word); } echo implode(' ', $words);  

Комментарии:

1. Спасибо вам за это решение . Это действительно помогло мне

2. Можно ли решить эту проблему без использования implode?

Ответ №2:

Давайте сделаем это простым способом. Давайте зациклимся $oldWords , сравним строки от второго символа до конца с их строчной версией и заменим, если результат отличается.

 for ($index = 0; $index lt; count($oldWords); $index  ) {  //Skip one-lettered words, such as a or A  if (strlen($oldWords[$index]) gt; 1) {  $lower = strtolower($oldWords[$index]);  if (substr($oldWords[$index], 1) !== substr($lower, 1)) {  $oldWords[$index] = $lower;  }  } }  

Комментарии:

1. Мне нравится ваш подход . Я буду изучать его . Спасибо

2. @ZackFair, конечно. Мой пример кода был непроверен, поэтому, если он не работает, скорее всего, у меня была опечатка. В таком случае, пожалуйста, сообщите мне о проблеме, и я разберусь в ней. Счастливого кодирования!

Ответ №3:

Если вы используете не только английский язык, возможно, вам захочется переключиться на mb_strtolower

 lt;?php  $text = 'Herman Archer LIVEs in neW YORK'; function normalizeText($text) {  $words = explode(" ", $text);  $normalizedWords = array_map(function ($word) {  $loweredWord = strtolower($word);    if (ucfirst($loweredWord) === $word) {  return $word;  }   return $loweredWord;  }, $words);   return join(" ", $normalizedWords); }  echo normalizeText($text) . PHP_EOL; // Herman Archer lives in new york   

Комментарии:

1. О, я не боролся с этим . Спасибо

Ответ №4:

вы можете объединить ctype_upper для первого символа и ctype_lower для остальных

 $text = 'Herman Archer LIVEs in neW YORK'; $oldWords = explode(' ', $text); $newWords = '';  foreach ($oldWords as $word) {  if(ctype_upper($word[0])amp;amp;ctype_lower(substr($word,1))){  $newWords .= $word.' ';  }else{  $newWords .= strtolower($word).' ';  } }  echo $newWords;  

Ответ №5:

Тем временем я обнаружил, что это можно сделать более простым способом

 if(isset($_POST["sumbit"])){  $string = $_POST["string"];  if(!empty($string)){  $word = explode (" ",$string);  foreach($words as $word){  //cut the first letter.  //check caselower.  //if not, attach the letter back and turn all lowercase.  //if yes, attach the letter back and leave it .   $wordCut = substr($word,1);  if(ctype_lower($wordCut)){  echo $word." ";  } else {  echo strtolower($word). " ";  }  }