【问题标题】:PHP: Normalize a stringPHP:规范化字符串
【发布时间】:2012-04-25 22:42:24
【问题描述】:

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

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

失败。

我需要纠正什么? 有没有更好的办法?

问候

编辑:

嗨,

感谢大家提供的所有 cmets 和答案。 我发现了另一种“现代”方法:

public function namilize($string)
{
    $string = mb_convert_case($string, MB_CASE_TITLE, mb_detect_encoding($string));
}

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

【问题讨论】:

  • 我完全不明白你为什么要炸毁$string。
  • 你打算如何处理像 McVeigh 这样的名字?

标签: php string normalize


【解决方案1】:

你必须通过引用传递 $string,注意 &:

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

    return $string;
}

或者使用@thetaikoucwords($string)建议的功能

【讨论】:

    【解决方案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% 万无一失的。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-10-10
        • 2018-09-29
        • 2020-02-12
        • 2016-08-29
        • 1970-01-01
        • 2013-06-29
        • 2019-04-19
        • 2014-05-10
        • 2016-07-06
        相关资源
        最近更新 更多