У меня есть партия строк, например, так:
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
Ты можешь использовать str_replace за это. Если вы используете массивы для первых двух аргументов, вы можете определить набор слов и замен:
echo str_replace(['Ipad', 'Iphone'], ['iPad', 'iPhone'], ucwords(strtolower($string)));
Из документации:
Если поиск и замена являются массивами, то str_replace () получает значение из каждого массива и использует их для поиска и замены по теме.
Поскольку вы знаете конкретные слова, и они ограничены, почему бы вам просто не вернуть их обратно после полной капитализации, как следующие
$string = ucwords(strtolower($string));
$string = str_replace("Ipad","iPad", $string);
$string = str_replace ("Iphone","iPhone", $string);
+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 для других ответов, так как они идеально подходят для этой специальной задачи.
Вместо того, чтобы писать прописную и прописную версию каждого слова, которое вы хотите исключить соответственно, и, следовательно, записывать их дважды, вы можете определить их только один раз в массиве и использовать 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 использует по умолчанию.
Лучшая практика — позвонить 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
означает «перезапустить совпадение полной строки» или другими словами «потребить и забыть предыдущие символы в текущем сопоставлении».