строка — используйте заглавные буквы в каждом слове, ожидайте определенных слов

У меня есть партия строк, например, так:

tHe iPad hAS gONE ouT of STOCK
PoWER uP YOur iPhone
wHAT moDEL is YOUR aPPLE iPHOne

Я хочу использовать заглавные буквы первого символа каждого слова, а оставшиеся символы — в нижнем регистре — за исключением ссылок на iPhone или же iPad, Как в:

Используя:

ucwords(strtolower($string));

Это может сделать большую часть того, что необходимо, но, очевидно, также делает это на iPadа также iPhone:

The Ipad Has Gone Out Of Stock
Power Up Your Iphone
What Model Is Your Apple Iphone

Как я могу добиться ниже:

The iPad Has Gone Out Of Stock
Power Up Your iPhone
What Model Is Your Apple iPhone

2

Решение

Ты можешь использовать str_replace за это. Если вы используете массивы для первых двух аргументов, вы можете определить набор слов и замен:

echo str_replace(['Ipad', 'Iphone'], ['iPad', 'iPhone'], ucwords(strtolower($string)));

Из документации:

Если поиск и замена являются массивами, то str_replace () получает значение из каждого массива и использует их для поиска и замены по теме.

3

Другие решения

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

$string = ucwords(strtolower($string));
$string = str_replace("Ipad","iPad", $string);
$string = str_replace ("Iphone","iPhone", $string);
1

+1 для более общего решения:

<?php

$text = <<<END_TEXT
PoWER uP YOur iPhone
tHe iPad hAS gONE ouT of STOCK
wHAT moDEL is YOUR aPPLE iPHOne
END_TEXT;

$text = preg_replace(array('/iphone/i', '/iPad/i'), array('iPhone', 'iPad'), $text);
$text = preg_replace_callback('/(\b(?!iPad|iPhone)[a-zA-Z0-9]+)/',
function ($match) { return ucfirst(strtolower($match[1])); }, $text);

echo $text;

демонстрация

Использует отрицательное предположение в регулярном выражении, чтобы исключить перечисленные слова из сопоставления, и манипулирует остальными через обратный вызов анонимной функции. Таким образом, вы можете выполнять любые манипуляции, например, переворачивать строку и т. Д.

+1 для других ответов, так как они идеально подходят для этой специальной задачи.

0

Вместо того, чтобы писать прописную и прописную версию каждого слова, которое вы хотите исключить соответственно, и, следовательно, записывать их дважды, вы можете определить их только один раз в массиве и использовать str_ireplace вместо str_replace как это:

$string = "tHe IPHONE and iPad hAS gONE ouT of STOCK";

$excludedWords = array(
"iPad",
"iPhone");

echo str_ireplace($excludedWords, $excludedWords, ucwords(strtolower($string)));

Что приведет к

The iPhone And iPad Has Gone Out Of Stock

Это тогда заменит все вхождения этих слов версией, которую вы определили в массиве.

Редактировать:

Иметь ввиду что с помощью этого слова, такие как «shipadvertise», будут заменены на «shiPadvertise».
Если вы хотите предотвратить это, вы можете использовать более продвинутое решение, используя регулярные выражения:

$string = "tHe IPHONE and shipadvertise iPad hAS gONE ouT of STOCK";

$excludedWords = array(
"iPad",
"iPhone");
$excludedWordsReg = array_map(function($a) { return '/(?<=[\s\t\r\n\f\v])'.preg_quote($a).'/i'; }, $excludedWords);

echo preg_replace($excludedWordsReg, $excludedWords, ucwords(strtolower($string)));

Это тогда правильно разрешит в

The iPhone And Shipadvertise iPad Has Gone Out Of Stock

Я использовал разделители для определения слов ucwords использует по умолчанию.

0

Лучшая практика — позвонить strtolower() на входной строке сразу (ответ syck не делает этого).

Я предложу чистое регулярное выражение, которое будет соответствующим образом нацелено на ваш ipad а также iphone слова и заглавные буквы их секунды, в то время как заглавная буква всех других слов.

Код: (PHP Demo) (Образец Демо)

$strings = [
"tHe iPad hAS gONE ouT of STOCK
PoWER uP YOur iPhone
wHAT moDEL is YOUR aPPLE iPHOne",           // OP's input string
"fly the chopper to the helipad.
an audiphone is a type of hearing aid
consisting of a diaphragm that, when
placed against the upper teeth, conveys
sound vibrations to the inner ear"          // some gotcha strings in this element
];

foreach ($strings as $string) {
echo preg_replace_callback('~\bi\K(?:pad|phone)\b|[a-z]+~', function($m) {return ucfirst($m[0]);}, strtolower($string));
echo "\n---\n";
}

Выход:

The iPad Has Gone Out Of Stock
Power Up Your iPhone
What Model Is Your Apple iPhone
---
Fly The Chopper To The Helipad.
An Audiphone Is A Type Of Hearing Aid
Consisting Of A Diaphragm That, When
Placed Against The Upper Teeth, Conveys
Sound Vibrations To The Inner Ear
---

Вероятно, единственные части, которые следует упомянуть о шаблоне регулярных выражений, это то, что \K означает «перезапустить совпадение полной строки» или другими словами «потребить и забыть предыдущие символы в текущем сопоставлении».

0