2012-01-04 75 views
37

Tất cả, Tôi đang cố gắng chèn họ vào cơ sở dữ liệu. Tôi muốn chữ cái đầu tiên được viết hoa cho tên và nếu họ đã sử dụng hai tên cuối cùng thì viết hoa tên thứ nhất và thứ hai. Vì vậy, ví dụ nếu một người nào đó đi vào:Viết hoa chữ hoa đầu tiên và chữ thường viết hoa trong một chuỗi

marriedname maidenname

Nó sẽ chuyển đổi này để Marriedname Maidenname và vân vân nếu có nhiều thì hai tên. Kịch bản khác là là ai đó có một dấu nháy đơn trong tên của họ, như vậy là có cách nào để làm điều đó nếu ai đó bước vào:

O'Connell

này sẽ cần phải chuyển đổi sang O'Connell. Tôi đã sử dụng:

ucfirst(strtolower($last_name)); 

Tuy nhiên, như bạn có thể nói điều đó sẽ không hoạt động đối với tất cả các trường hợp. Cảm ơn lời khuyên nào!

+1

gì về * DeVries *? : -3 – deceze

+1

@deceze haha ​​điểm tốt. Tôi đoán tôi sẽ chỉ hy vọng họ gõ một cách chính xác :) – user1048676

+0

ngay cả khi họ làm bạn đang hạ thấp nó. –

Trả lời

30

Điều này sẽ viết hoa tất cả các chữ cái đầu tiên của từ và chữ ngay sau dấu nháy đơn. Nó sẽ làm cho tất cả các chữ cái khác thường. Nó sẽ làm việc cho bạn:

str_replace('\' ', '\'', ucwords(str_replace('\'', '\' ', strtolower($last_name)))); 
+1

Đoạn mã nhỏ tuyệt vời! – FastTrack

+0

Chính xác những gì tôi cần. Cảm ơn! – user1105056

+0

Làm thế nào là tuyệt vời này ?! Nó làm cho dấu chấm phẩy xuất hiện sau mỗi dấu gạch chéo có thể đã có trong chuỗi nguồn, và chỉ bắt các từ sau dấu chấm phẩy, mà thậm chí không phải là ký tự chính xác về mặt chữ. – j4k3

1

Bạn có thể sử dụng preg_replace với e cờ (thực hiện một chức năng php):

function processReplacement($one, $two) 
{ 
    return $one . strtoupper($two); 
} 

$name = "bob o'conner"; 
$name = preg_replace("/(^|[^a-zA-Z])([a-z])/e","processReplacement('$1', '$2')", $name); 

var_dump($name); // output "Bob O'Conner" 

Có lẽ mô hình regex có thể được cải thiện, nhưng những gì tôi đã làm là :

  • $1 là một trong hai đầu của dòng hoặc bất kỳ ký tự không thuộc chữ cái.
  • $2 là bất kỳ ký tự chữ thường

Sau đó chúng tôi thay thế cả hai những người có kết quả của processReplacement() chức năng đơn giản.

Nếu bạn đã có PHP 5.3, điều đó có thể đáng giá để làm processReplacement() một chức năng ẩn danh.

0

Chuyển đổi đầu tiên thành trường hợp tiêu đề, sau đó tìm dấu nháy đơn đầu tiên và viết hoa ký tự TIẾP THEO. Bạn sẽ cần phải thêm nhiều kiểm tra, để đảm bảo rằng có một char sau dấu nháy đơn và mã này sẽ chỉ hoạt động trên một dấu nháy đơn. ví dụ. "Mary O'Callahan O'connell".

$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8"); 
$pos = strpos($str, "'"); 
if ($pos != FALSE) 
{ 
    $str[$pos+1] = strtoupper($str[$pos+1]); 
} 
2

Tôi không tin rằng sẽ có một câu trả lời hay bao gồm tất cả các tình huống cho bạn. Diễn đàn PHP.net cho ucwords có số lượng thảo luận hợp lý nhưng dường như không có câu trả lời nào cho tất cả. Tôi khuyên bạn nên chuẩn hóa hoặc sử dụng chữ hoa hoặc chỉ để lại đầu vào của người dùng.

4

Sử dụng built-in chức năng này:

ucwords('string'); 
+0

Điều này sẽ chuyển thành 'StRinG' nếu từ đó là' stRinG'. Sẽ không viết hoa tất cả. – emotality

+1

Vì vậy, 'ucwords (strtolower ('stRing'))'? –

19

Không ai trong số đó là những UTF8 thân thiện, vì vậy đây là một trong những hoạt động hoàn hảo (cho đến nay)

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("and", "to", "of", "das", "dos", "I", "II", "III", "IV", "V", "VI")) 
{ 
    /* 
    * Exceptions in lower case are words you don't want converted 
    * Exceptions all in upper case are any words you don't want converted to title case 
    * but should be converted to upper case, e.g.: 
    * king henry viii or king henry Viii should be King Henry VIII 
    */ 
    $string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8"); 
    foreach ($delimiters as $dlnr => $delimiter) { 
     $words = explode($delimiter, $string); 
     $newwords = array(); 
     foreach ($words as $wordnr => $word) { 
      if (in_array(mb_strtoupper($word, "UTF-8"), $exceptions)) { 
       // check exceptions list for any words that should be in upper case 
       $word = mb_strtoupper($word, "UTF-8"); 
      } elseif (in_array(mb_strtolower($word, "UTF-8"), $exceptions)) { 
       // check exceptions list for any words that should be in upper case 
       $word = mb_strtolower($word, "UTF-8"); 
      } elseif (!in_array($word, $exceptions)) { 
       // convert to uppercase (non-utf8 only) 
       $word = ucfirst($word); 
      } 
      array_push($newwords, $word); 
     } 
     $string = join($delimiter, $newwords); 
    }//foreach 
    return $string; 
} 

Cách sử dụng:

$s = 'SÃO JOÃO DOS SANTOS'; 
$v = titleCase($s); // 'São João dos Santos' 
1

Đây là câu trả lời đơn giản hơn và trực tiếp hơn cho câu hỏi chính. hàm dưới đây bắt chước các cách tiếp cận PHP. Chỉ trong trường hợp nếu PHP mở rộng này với không gian tên của họ trong tương lai, kiểm tra đầu tiên được kiểm tra. Im sử dụng bằng chứng nước này cho bất kỳ ngôn ngữ nào trong cài đặt wordpress của tôi.

$str = mb_ucfirst($str, 'UTF-8', true); 

Điều này làm chữ in hoa đầu tiên và tất cả chữ thường khác với chữ Q. Nếu arg thứ ba được đặt thành false (mặc định), phần còn lại của chuỗi không được thao tác.

// Extends PHP 
if (!function_exists('mb_ucfirst')) { 

function mb_ucfirst($str, $encoding = "UTF-8", $lower_str_end = false) { 
    $first_letter = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding); 
    $str_end = ""; 
    if ($lower_str_end) { 
     $str_end = mb_strtolower(mb_substr($str, 1, mb_strlen($str, $encoding), $encoding), $encoding); 
    } else { 
     $str_end = mb_substr($str, 1, mb_strlen($str, $encoding), $encoding); 
    } 
    $str = $first_letter . $str_end; 
    return $str; 
} 

} 

/Lundman

+1

Tôi có thể thiếu một cái gì đó, nhưng điều này dường như chỉ làm cho chữ cái đầu tiên của chuỗi chữ hoa? Câu hỏi ban đầu là làm thế nào để làm cho chữ cái đầu tiên của tất cả các từ chứa trong một trường hợp trên String. – DB5

19

bạn có thể thử điều này cho chữ của

<?php echo ucwords(strtolower('Dhaka, JAMALPUR, sarishabari')) ?> 

kết quả là: Dhaka, Jamalpur, Sarishabari

+0

Chỉ cần thêm liên kết tài liệu cho anwer này. http://php.net/manual/en/function.ucfirst.php –

0

sử dụng như thế này ucfirst(strtolower($var));

Các vấn đề liên quan