1

我想将字符串规范化(因此规范化)为名称的正常形式:

  1. 名字的第一个字母是大写的

这样做的困难现在是使用第二名和第三名遵循此规则。

我的方法:

    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 添加一些正则表达式时,它会是完整的:)

4

3 回答 3

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% 万无一失的。

于 2012-04-13T15:04:47.190 回答
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;
}
于 2012-04-13T15:04:54.327 回答
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)

于 2012-04-13T14:47:37.780 回答