PHP - 大写每个单词的第一个字符,期望某些单词

时间:2015-12-16 17:12:07

标签: php string lowercase capitalize

我有一批像这样的字符串:

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

我希望将每个单词的第一个字符大写,并将其余字符设为小写 - 除了iPhoneiPad的任何引用。如:

使用:

ucwords(strtolower($string));

这可以完成所需的大部分工作,但显然也会在iPadiPhone上执行此操作:

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

6 个答案:

答案 0 :(得分:3)

您可以使用str_replace。如果对前两个参数使用数组,则可以定义一组单词和替换:

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

来自文档:

  

如果搜索和替换是数组,则str_replace()从每个数组中获取一个值,并使用它们来搜索和替换主题。

答案 1 :(得分:1)

正如您所知道的具体单词,并且它们是有限的,为什么不在总资本化后将其还原,如下所示

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

答案 2 :(得分:0)

+1 forA更通用的解决方案:

<?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

在正则表达式中使用负向前瞻以排除列出的单词与匹配,并通过回调到匿名函数来操纵其他单词。这样,你可以进行任何类型的操作,例如反转字符串等。

其他答案的+1,因为它们非常适合这项特殊任务。

答案 3 :(得分:0)

您不必分别编写要排除的每个单词的小写和大写版本,因此必须将它们写两次,您只能在数组中定义它们一次并使用str_ireplace而不是{{ 1}}像这样:

str_replace

哪会导致

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

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

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

然后,这将使用您在数组中定义的版本替换所有出现的这些单词。

编辑:

请记住,使用此功能,“shipadvertise”之类的字词将替换为“shiPadvertise”。 如果要阻止这种情况,可以使用正则表达式使用更高级的解决方案:

The iPhone And iPad Has Gone Out Of Stock

然后将正确解析为

$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)));

我已经使用分隔符来默认确定单词ucwords

答案 4 :(得分:0)

最佳做法是立即在输入字符串上调用strtolower()(syck的答案不会这样做)。

我将提供一个纯正则表达式解决方案,该解决方案将适当地定位您的ipadiphone单词并大写它们的秒字母,同时大写所有其他单词的首字母。

代码:(PHP Demo)(Pattern 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的意思是“重新开始全字符串匹配”,或者换句话说就是“消耗并忘记当前匹配中的前一个字符”。

答案 5 :(得分:0)

这可能会为您提供帮助。.我编写此代码供我使用,并且对我来说非常有用...

<?php
function strtocap($arg){
    $finalStr = array();

    $argX = explode(" ",$arg);
    if(is_array($argX)){
        foreach($argX as $v){
            $finalStr[] = ucfirst(strtolower($v));
        }
    }
return implode(" ",$finalStr);
}

$str = "Your unForMated StrInG";
echo strtocap($str);
?>