2012-10-17 36 views
12

Mẫu giáo 101 dạy một số người trong chúng ta rằng: "Các chữ cái trong tên của bạn phải là chữ thường, với chữ in hoa đầu tiên." Tuy nhiên, trong thời đại hậu văn hóa này, cách mọi người nhập tên của họ trong các biểu mẫu web dường như phụ thuộc vào tâm trạng của họ, hoặc pháo sáng mặt trời hay không: Tất cả chữ hoa, chữ thường, hỗn hợp, lộn ngược ...Bất cứ ai cũng biết một chức năng trang nhã để sửa chữa các trường hợp tên?

Về mặt triết học, tôi nói bất cứ điều gì! Chiếm tên của bạn, những người quan tâm. Nhưng tôi có khách hàng OCD thích xem dữ liệu được chuẩn hóa, chuẩn hóa, có thể đoán trước được. Vì vậy, tôi đề nghị các bạn nếu bạn đã nhìn thấy bất kỳ chức năng cũng suy nghĩ ra PHP đối với trường hợp dàn xếp tỷ số tên, mà đi vào xem xét các trường hợp ngoại lệ khác nhau mà ucwords() sẽ hoàn toàn Butcher, chẳng hạn như:

  • Sven- Alex gàn
  • Ronaldo McDonaldo
  • Boopsie O'Brien
  • JR Bob Dobbs
  • Francesca de los Gatos
  • YungCheng Li

Có bất kỳ chức năng nào ở đó cố gắng thu xếp các phiến quân bảng chữ cái này không?

CẬP NHẬT
Từ điểm v.v. của van-tage, không có kịch bản nào để loại trừ tất cả. Nhưng tôi đã quyết định rằng các tên được nhập hoàn toàn bằng chữ viết hoa hoặc viết thường là những ứng cử viên cho một sự cọ xát tốt. Vì vậy, đối này, tôi sẽ làm ...

if ($name == strtoupper($name) || $name == strtolower($name)) { 
     $name = ucwords(strtolower($name)); 
    } 

Nó sẽ là đủ dễ dàng để sửa đổi này để sửa chữa một vài trường hợp ngoại lệ có thể: dấu gạch ngang, dấu nháy, 'McDonalds', vv sai lầm sẽ được thực hiện, nhưng ai sẽ than phiền? Không phải tên khốn ngoan ngoãn đã nhập tên của họ bằng chữ thường.

Xin chờ, tên của tôi ở dạng chữ thường ...

+0

upvoted câu hỏi của bạn chỉ dành riêng cho ** J.R. Bob Dobbs **. – ocodo

Trả lời

7

Điều này đơn giản là không thể.

Cách viết tên khác nhau giữa các quốc gia, như bạn thể hiện trong câu hỏi của mình. Cách dễ nhất để đi là tìm cách đánh vần phổ biến nhất và đó là viết hoa mọi chữ cái đầu tiên của mỗi từ '', tức là mỗi chuỗi đứng trước dấu cách, gạch nối, dấu chấm hoặc dấu nháy đơn.

Điều này không khắc phục được tất cả sự cố của bạn (YungCheng, McDonaldo) và khiến bạn gặp phải các sự cố khác, nhưng điều đó gần như bạn sắp đạt được.

Hãy so sánh:

  • Alex Van Halen (US chính tả)
  • Alex Van Halen (đúng chính tả Hà Lan)

Không có thuật toán sửa chữa này.

This article minh họa sự cố với tên tiếng Hà Lan rất tốt và đó chỉ là một ngôn ngữ. Có lẽ một bài báo như thế này cho mọi ngôn ngữ trên thế giới.;)

+0

Điểm tốt, tôi đã không xem xét van/Van imbroglio. Tôi cho rằng một giải pháp sẽ là kiểm tra xem một tên đã nhập có phải là chữ hoa chữ thường hay chữ thường, và chỉ sau đó chạy tên thông qua một số hàm. – neokio

+0

Vâng, bạn có thấy 'v' trong tên người dùng của mình không? Tôi sẽ ghét nó nếu một cái gì đó hoặc một người nào đó vượt qua điều đó. Chỉ cần không cảm thấy đúng. Bạn thực sự có thể mở rộng logic của bạn để xem liệu ai đó đã nhập bất kỳ thủ đô nào và hành động phù hợp. (Hoặc nói với khách hàng của bạn điều này là không thể và có lẽ rẻ hơn để có nó con người cố định.) – Sherlock

+1

Nó không phải là không thể ATTEMPT để chứa các phiến quân bảng chữ cái, và đó là câu hỏi !! – davidkonrad

5

Dưới đây là một thử

$names=array(); 
$names[]="sven-alex crumpet"; 
$names[]="RONALDO McDonalDO"; 
$names[]="Boopsie o'Brien"; 
$names[]="j.r. BOB DOBBS"; 
$names[]="francesca DE LOS gatOS"; 
$names[]="yungcheng LI"; 
$names[]="mr hankey"; 
$names[]="santas little helper"; 
$names[]="j.r.r. tolkien"; 

$splitters=array(' ','.',"'",'-'); //more to come 
$fixedNames=array(); 

foreach($names as $name) { 
    $fixed=''; 
    $blank=str_replace($splitters,'?',$name); 
    $n=explode('?',$blank); 
    foreach($n as $f) $fixed.=ucfirst(strtolower($f)).' '; 
    for ($i=0;$i<strlen($fixed);$i++) { 
     if ($fixed[$i]==' ') { 
      if ($blank[$i]=='?') { 
       $fixed[$i]=$name[$i]; 
      } 
     } 
    } 
    $fixedNames[]=substr_replace($fixed,'', -1); 
} 

echo '<pre>'; 
print_r($fixedNames); 
echo '<pre>'; 

đầu ra

Array 
(
    [0] => Sven-Alex Crumpet 
    [1] => Ronaldo Mcdonaldo 
    [2] => Boopsie O'Brien 
    [3] => J.R. Bob Dobbs 
    [4] => Francesca De Los Gatos 
    [5] => Yungcheng Li 
    [6] => Mr Hankey 
    [7] => Santas Little Helper 
    [8] => J.R.R. Tolkien 
) 

Không thể "đúng" một cái tên như YungCheng mà không cần thuật toán chăm sóc ước khu vực/văn hóa và một cơ sở dữ liệu tên khổng lồ để so sánh với.

+1

Đẹp nhất! Logic chặt chẽ :) – neokio

0

Tôi tìm thấy một thư viện phong nha để xử lý tên người khác nhau ở các định dạng khác nhau được viết bằng python có tên là nameparser. Nó vẫn không xử lý tất cả các tên được liệt kê ở trên, nhưng với một số configuration bạn có thể có được gần gũi.

Tôi cũng đã viết một đoạn ngắn blog mô tả cách tải thư viện tên trình làm việc từ thiết bị đầu cuối. Có lẽ nó sẽ giúp ai đó.

Đây là kịch bản python cơ bản:

import sys 
import json 
from nameparser import HumanName 

rawname = ' '.join(sys.argv[1:]).lower().strip() 

name = HumanName(rawname) 

# attempt to fix name title case 
name.capitalize() 

print json.dumps({ 
    'fullname': name.__str__(), 
    'title': name.title, 
    'first': name.first, 
    'middle': name.middle, 
    'last': name.last, 
    'suffix': name.suffix, 
    'nickname': name.nickname 
}) 
Các vấn đề liên quan