3

我需要一些帮助我有这个代码,将字符串中每个单词的第一个字符大写,但如果异常位于字符串的开头,我需要该函数忽略异常:

function ucwordss($str, $exceptions) {
$out = "";
foreach (explode(" ", $str) as $word) {
$out .= (!in_array($word, $exceptions)) ? strtoupper($word{0}) . substr($word, 1) . " " : $word . " ";
}
return rtrim($out);
}

$string = "my cat is going to the vet";
$ignore = array("is", "to", "the");
echo ucwordss($string, $ignore);
// Prints: My Cat is Going to the Vet

这就是我正在做的事情:

$string = "my cat is going to the vet";
$ignore = array("my", "is", "to", "the");
echo ucwordss($string, $ignore);
// Prints: my Cat is Going to the Vet
// NEED TO PRINT: My Cat is Going to the Vet
4

5 回答 5

4
- return rtrim($out);
+ return ucfirst(rtrim($out));
于 2012-08-16T22:46:28.107 回答
3

像这样的东西:

function ucwordss($str, $exceptions) {
    $out = "";
    foreach (explode(" ", $str) as $key => $word) {
        $out .= (!in_array($word, $exceptions) || $key == 0) ? strtoupper($word{0}) . substr($word, 1) . " " : $word . " ";
    }
    return rtrim($out);
}

或者更简单,return在你的函数之前 make strtoupper 第一个字母

于 2012-08-16T22:43:58.450 回答
1

只需始终将您的第一个单词大写,就可以非常便宜地做到这一点:

function ucword($word){
    return strtoupper($word{0}) . substr($word, 1) . " ";
}

function ucwordss($str, $exceptions) {
    $out = "";
    $words = explode(" ", $str);
    $words[0] = ucword($words[0]);
    foreach ($words as $word) {
        $out .= (!in_array($word, $exceptions)) ? ucword($word)  : $word . " ";
    }
    return rtrim($out);
}
于 2012-08-16T22:44:34.833 回答
0

你把字符串中的第一个字母变成大写怎么样,所以无论你的混音如何,你仍然会通过

$string = "my cat is going to the vet";
$string = ucfirst($string);
$ignore = array("is", "to", "the");
echo ucwordss($string, $ignore);

这样你字符串的第一个字母总是大写

于 2012-08-16T22:56:17.120 回答
0

preg_replace_callback()将允许您以无循环和动态的方式表达您的条件替换逻辑。考虑这种可以适当修改您的样本数据的方法:

代码:(PHP 演示)(模式演示

$string = "my cat is going to the vet";
$ignore = array("my", "is", "to", "the");
$pattern = "~^[a-z]+|\b(?|" . implode("|", $ignore) . ")\b(*SKIP)(*FAIL)|[a-z]+~";
echo "$pattern\n---\n";
echo preg_replace_callback($pattern, function($m) {return ucfirst($m[0]);}, $string);

输出:

~^[a-z]+|\b(?|my|is|to|the)\b(*SKIP)(*FAIL)|[a-z]+~
---
My Cat is Going to the Vet

你看,模式的三个管道部分(按顺序)提出了这些要求:

  1. 如果字符串的开头是单词,则将第一个字母大写。
  2. 如果在“黑名单”中找到“整个单词”(利用\b单词边界元字符),则取消匹配并继续遍历输入字符串。
  3. 否则将每个单词的第一个字母大写。

现在,如果您想特别了解缩略词和连字词,那么您只需要像这样将'和添加-[a-z]字符类中:([a-z'-] Pattern Demo

如果有人有会破坏我的片段的边缘案例(例如带有特殊字符的“单词”需要通过 转义preg_quote()),您可以提供它们,我可以提供补丁,但我的原始解决方案将充分服务于发布的问题。

于 2018-12-03T04:07:12.197 回答