#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). " "; } }