2015-12-16 4 views
1

У меня есть партия строк так:PHP - прописной первый символ каждого слова ожидает определенные слова

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

Затем вам нужно проверить состояние нескольких слов. Если эти слова не найдены, примените условие. –

+4

Возможный дубликат функции [ucwords с исключениями] (http://stackoverflow.com/questions/11996446/ucwords-function-with-exceptions) – Manath

+0

Может делать регулярное выражение; https://regex101.com/r/bH2yY6/1 – chris85

ответ

2

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

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

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

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

1

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

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

+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; 

Demo

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

+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 

это позволило бы заменить все вхождения этих слов с версии, которые вы определили в массиве.

Edit:

Имейте в виду, что с помощью этого слова, как "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 использования по умолчанию.

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