2012-04-13 70 views
1

我想正常化(所以规范化)的字符串进入正常形式的名称:PHP:规范化字符串

  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

尝试'ucwords($字符串)' – thetaiko 2012-04-13 14:46:34

+0

我完全不明白你为什么要摆在首位的爆炸'$ string'。 – hjpotter92 2012-04-13 14:47:07

+3

你打算怎么处理像McVeigh这样的名字? – ceejayoz 2012-04-13 14:47:08

回答

2
建议

请注意,这将适用于名称,如John O'Brian,James McManus等。对于其他名称的前缀如McManus,只需将该前缀添加到preg_match()即可。显然,这会产生误报的可能性,但没有任何方法可以100%万无一失。

1

你必须通过引用传递的$字符串,记在&

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

    return $string; 
} 

或者使用功能由@thetaikoucwords($string)

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