鉴于大写名称转换成合适的大小写,处理“奥哈拉”,“麦当劳”,“斯沃特”等(Given upper c

2019-09-19 16:14发布

我提供了大写名称的列表。 对于电子邮件中的问候语的目的,我想他们他们能够正确的下套管。

很容易的使用PHP的做ucwords 。 但我觉得我需要一些正则表达式函数来处理常见异常,如:

“奥哈拉”,“麦当劳”,“斯沃特”,等等。

这不是这么多,我需要帮助构建一个正则表达式语句来处理上述三个例子(寿将是很好),因为这是我不知道所有常见的例外可能。

肯定有人已经面对过这个问题,任何指针公布的解决方案,或者您也可以分享的东西?

Answer 1:

在很短的提供的列表使用正则表达式可以很容易的,但如果你必须处理的记录成百上千它很难是防弹。

我宁愿使用的东西,不能影响别人。 你怎么知道,如果先生“麦当劳”喜欢“麦当劳”?

你纠正别人的错误。 如果源不能被纠正,你可以使用这样的事情:

<?php

$provided_names = array(
  "SMITH",
  "O'HARA",
  "MCDONALD",
  "JONES",
  "VAN DER SLOOT",
  "MACDONALD"
);

$corrected_names = array(
  "O'HARA"        => "O'Hara",
  "MCDONALD"      => "McDonald",
  "VAN DER SLOOT" => "van der Sloot"
);

$email_text = array();

foreach ($provided_names as $provided_name)
{
  $provided_name = !array_key_exists($provided_name, $corrected_names) 
    ? ucwords(strtolower($provided_name)) 
    : $corrected_names[$provided_name];
  $email_text[]  = "{$provided_name}, your message text.";
}

print_r($email_text);

/* output:
Array
(
  [0] => Smith, your message text.
  [1] => O'Hara, your message text.
  [2] => McDonald, your message text.
  [3] => Jones, your message text.
  [4] => van der Sloot, your message text.
  [5] => Macdonald, your message text.
)
*/
?>

我希望这是有用的。



Answer 2:

我写这在今天的应用程序我工作的落实。 我觉得这个代码是非常自我解释与评论。 这不是在所有情况下准确的100%,但它会处理大部分的西方名字容易。

例子:

mary-jane => Mary-Jane

o'brien => O'Brien

Joël VON WINTEREGG => Joël von Winteregg

jose de la acosta => Jose de la Acosta

该代码是你可以在上面任意字符串值添加到阵列,以满足您的需求进行扩展。 请研究并补充说,可能需要的任何特殊功能。

function name_title_case($str)
{
  // name parts that should be lowercase in most cases
  $ok_to_be_lower = array('av','af','da','dal','de','del','der','di','la','le','van','der','den','vel','von');
  // name parts that should be lower even if at the beginning of a name
  $always_lower   = array('van', 'der');

  // Create an array from the parts of the string passed in
  $parts = explode(" ", mb_strtolower($str));

  foreach ($parts as $part)
  {
    (in_array($part, $ok_to_be_lower)) ? $rules[$part] = 'nocaps' : $rules[$part] = 'caps';
  }

  // Determine the first part in the string
  reset($rules);
  $first_part = key($rules);

  // Loop through and cap-or-dont-cap
  foreach ($rules as $part => $rule)
  {
    if ($rule == 'caps')
    {
      // ucfirst() words and also takes into account apostrophes and hyphens like this:
      // O'brien -> O'Brien || mary-kaye -> Mary-Kaye
      $part = str_replace('- ','-',ucwords(str_replace('-','- ', $part)));
      $c13n[] = str_replace('\' ', '\'', ucwords(str_replace('\'', '\' ', $part)));
    }
    else if ($part == $first_part && !in_array($part, $always_lower))
    {
      // If the first part of the string is ok_to_be_lower, cap it anyway
      $c13n[] = ucfirst($part);
    }
    else
    {
      $c13n[] = $part;
    }
  }

  $titleized = implode(' ', $c13n);

  return trim($titleized);
}


Answer 3:

我写了这个小LIB: https://github.com/tamtamchik/namecase你可以安装它作曲 。

为了您输入它产生正是你需要使用下面的代码是什么:

<?php

require_once 'vendor/autoload.php'; // Composer autoload

$arr = ["O'HARA", "MCDONALD", "VAN DER SLOOT"];

foreach ($arr as $name) {
    echo $name . ' => ' . str_name_case($name) . PHP_EOL;
}

呼叫功能str_name_case随机附带任何名称字符串一个lib,它会被转换为正确的大小写。 为了您的例子输出将变为:

O'HARA =>奥哈拉
MCDONALD =>麦当劳
VAN DER SHUT =>斯沃特



文章来源: Given upper case names transform to Proper Case, handling “O'Hara”, “McDonald” “van der Sloot” etc