PHP:规范化字符串

PHP:规范化字符串,php,string,normalize,Php,String,Normalize,我想将字符串规范化(以便规范化)为名称的标准形式: 名字的第一个字母是大写的 现在的困难是,要用第二个和第三个名字来遵循这条规则 我的方法: public function namilize($string) { $strings = explode(' ', $string); foreach ($strings as $string) { $string = ucfirst(strtolower($string)); } $string

我想将字符串规范化(以便规范化)为名称的标准形式:

  • 名字的第一个字母是大写的
  • 现在的困难是,要用第二个和第三个名字来遵循这条规则

    我的方法:

        public function namilize($string)
    {
        $strings = explode(' ', $string);
        foreach ($strings as $string) {
            $string = ucfirst(strtolower($string));
        }
        $string = implode(' ', $strings);
    
        return $string;
    }
    
    不知怎的

    $string = ucfirst(strtolower($string));
    
    失败了

    我必须纠正什么? 有更好的办法吗

    问候

    编辑:

    谢谢大家的评论和回答。 我找到了另一种“现代”方法:


    当我现在要为Mc和O添加一些正则表达式时,要比它完整的多:)

    您必须通过引用传递$string,请注意
    &

        public function namilize($string)
    {
        $strings = explode(' ', $string);
        foreach ($strings as &$string) {
            $string = ucfirst(strtolower($string));
        }
        $string = implode(' ', $strings);
    
        return $string;
    }
    

    或者使用
    ucwords($string)
    建议的函数。您必须通过引用传递$string,请注意
    &

        public function namilize($string)
    {
        $strings = explode(' ', $string);
        foreach ($strings as &$string) {
            $string = ucfirst(strtolower($string));
        }
        $string = implode(' ', $strings);
    
        return $string;
    }
    
    或者使用
    ucwords($string)

    请注意,这将适用于诸如
    John O'Brian
    James McManus
    等名称。对于前缀为
    McManus
    的其他名称,只需将前缀添加到
    preg_match()
    。显然,这有可能出现误报,但没有一种方法是100%万无一失的


    请注意,这将适用于诸如
    John O'Brian
    James McManus
    等名称。对于前缀为
    McManus
    的其他名称,只需将前缀添加到
    preg_match()
    。显然,这有可能出现误报,但没有一种方法是100%万无一失的。

    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;
    }
    

    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;
    }
    

    我完全不明白你为什么要首先分解
    $string
    。你打算怎么处理像McVeigh这样的名字?我完全不明白你为什么要首先分解
    $string
    。你打算怎么处理像McVeigh这样的名字?