Php 将名称大写的简单方法,例如;o';沙利文;?

Php 将名称大写的简单方法,例如;o';沙利文;?,php,Php,以两个字符串为例: "o'sulLivAn" "doUble-baRrel" 预期结果: "O'Sullivan" "Double-Barrel" 我认为ucwords(strtolower($str))可能会起作用,但它将字符串作为单个单词处理 我知道我可以分解,或者更确切地说是预拆分字符串,然后将部分大写并重新组合,但我想知道是否有更好的方法 通常使用PHP和这类东西时,往往会有一个函数隐藏在某个有用但不明显或不知名的地方。您可以在此处使用preg\u replace\u回调: $lin

以两个字符串为例:

"o'sulLivAn"
"doUble-baRrel"
预期结果:

"O'Sullivan"
"Double-Barrel"
我认为
ucwords(strtolower($str))
可能会起作用,但它将字符串作为单个单词处理

我知道我可以
分解
,或者更确切地说是
预拆分
字符串,然后将部分大写并重新组合,但我想知道是否有更好的方法


通常使用PHP和这类东西时,往往会有一个函数隐藏在某个有用但不明显或不知名的地方。

您可以在此处使用preg\u replace\u回调:

$lines = array(
    "o'sulLivAn",
    "doUble-baRrel",
);

function upcaseLetters($match){
    return strtoupper($match[0]);
}

foreach($lines as $line){
    echo preg_replace_callback('#^[\w]|[\W][\w]#','upcaseLetters',strtolower($line))."<br/>";
}

您可以在此处使用preg_replace_回调:

$lines = array(
    "o'sulLivAn",
    "doUble-baRrel",
);

function upcaseLetters($match){
    return strtoupper($match[0]);
}

foreach($lines as $line){
    echo preg_replace_callback('#^[\w]|[\W][\w]#','upcaseLetters',strtolower($line))."<br/>";
}

没有php函数可以执行此操作

这是一个没有回路的单行程序(有点)


没有php函数可以执行此操作

这是一个没有回路的单行程序(有点)


如果您不介意
e
修饰符:

preg_replace('!(^|\W)[a-z]!e', "strtoupper('\\0')", strtolower($text));

如果您不介意
e
修饰符:

preg_replace('!(^|\W)[a-z]!e', "strtoupper('\\0')", strtolower($text));

这是一个非常困难的问题,因为名字的大写方式有很大的差异。如果你真的想在一个非字母字符后大写,那么拆分和重组可能是最容易编码的。然而,要考虑“ValaleN”或“Tooft”这样的输入,可以是“VanHalen”和“TooFt”,或者“ValaleN”。你对“范德米斯”怎么办?它可能是“范德米斯”或“范德米斯”?“这是你要解决的问题的一部分吗?”吉姆幸运地没有!如果用户以这种方式输入字符串,则必须按照输入字符串的方式进行处理。这是一个非常困难的问题,因为名称的大写方式差异很大。如果你真的想在一个非字母字符后大写,那么拆分和重组可能是最容易编码的。然而,要考虑“ValaleN”或“Tooft”这样的输入,可以是“VanHalen”和“TooFt”,或者“ValaleN”。你对“范德米斯”怎么办?它可能是“范德米斯”或“范德米斯”?“这是你要解决的问题的一部分吗?”吉姆幸运地没有!如果用户以这种方式输入字符串,则必须将其视为他们输入的字符串。是的,这就是方法。regexp可以简化为
\b[a-z]
是的,这就是方法。regexp可以简化为
\b[a-z]
^1这比所选答案更容易理解。谢谢。^1这比选择的答案更容易理解。谢谢你。