PHP:规范化一个字符串

时间:2012-04-13 14:45:13

标签: php string normalize

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

  1. 名称的第一个字母是大写
  2. 现在的困难是按照这个规则使用第二和第三名。

    我的方法:

        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添加一些正则表达式时,它将完成:)

3 个答案:

答案 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'BrianJames 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;
}