我想将字符串规范化(如此规范化)为名称的正常形式:
现在的困难是按照这个规则使用第二和第三名。
我的方法:
public function namilize($string)
{
$strings = explode(' ', $string);
foreach ($strings as $string) {
$string = ucfirst(strtolower($string));
}
$string = implode(' ', $strings);
return $string;
}
不知何故
$string = ucfirst(strtolower($string));
失败。
我需要纠正什么? 还有更好的方法吗?
此致
编辑:
您好,
谢谢大家的所有评论和答案。 我找到了另一种“现代”方法:
public function namilize($string)
{
$string = mb_convert_case($string, MB_CASE_TITLE, mb_detect_encoding($string));
}
当我现在另外为Mc和O添加一些正则表达式时,它将完成:)
答案 0 :(得分:2)
public function namilize($name) {
$name = strtolower($name);
$normalized = array();
foreach (preg_split('/([^a-z])/', $name, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $word) {
if (preg_match('/^(mc)(.*)$/', $word, $matches)) {
$word = $matches[1] . ucfirst($matches[2]);
}
$normalized[] = ucfirst($word);
}
return implode('', $normalized);
}
请注意,这适用于John O'Brian
,James McManus
等名称。对于前缀为McManus
的其他名称,只需将前缀添加到preg_match()
即可。显然,这会产生误报的可能性,但没有任何方法可以100%万无一失。
答案 1 :(得分:1)
您必须通过引用传递$ string,请注意&
:
public function namilize($string)
{
$strings = explode(' ', $string);
foreach ($strings as &$string) {
$string = ucfirst(strtolower($string));
}
$string = implode(' ', $strings);
return $string;
}
或使用@thetaiko ucwords($string)
答案 2 :(得分:1)
foreach中的$ string只存储最后一次迭代(或姓氏)。这并不重要,因为foreach中的变量从未用于输出。内爆只是撤消了你对爆炸所做的事情,所以你最终会得到与输入完全相同的输出。在此示例中,我将变量名称更改为更具描述性:
function namilize($name_in)
{
$a_names = explode(' ', $name_in); //explode string into array
foreach ($a_names as $name) {
$a_fullname[] = ucfirst(strtolower($name)); //build array of proper case names
}
$string = implode(' ', $a_fullname); //convert array into string
return $string;
}