2011-12-15 21 views
5

Về cơ bản, nếu hai chuỗi sẽ đánh giá như nhau trong cơ sở dữ liệu của tôi, tôi cũng muốn có thể kiểm tra ở cấp ứng dụng. Ví dụ: nếu ai đó nhập "bjork" vào trường tìm kiếm, tôi muốn PHP có thể khớp với chuỗi đó với chuỗi "Björk" giống như MySQL. Tôi đoán PHP không có tương đương trực tiếp với các tùy chọn đối chiếu của MySQL và điều đơn giản nhất là viết một hàm đơn giản để chuyển đổi các chuỗi, sử dụng strtolower() để làm cho chúng trở nên đồng đều và strstr.() để thay thế các ký tự nhiều byte với tương đương ASCII tương ứng của chúng.Làm thế nào để mô phỏng các khớp nối utf8_general_ci của MySQL trong so sánh chuỗi PHP

Đó có phải là giả định chính xác không? Có ai có một mảng fool-proof tiện dụng để sử dụng như là tham số thứ hai của strstr() cho phù hợp với chuỗi như collations MySQL khác nhau sẽ làm gì (đặc biệt cho nhu cầu hiện tại của tôi, utf8_general_ci)? Hoặc, thiếu điều đó, nơi tôi có thể tìm thấy tài liệu về chính xác cách các collations khác nhau trong MySQL xử lý các nhân vật khác nhau? (Tôi thấy ở đâu đó rằng trong một số collations ß được coi là S và những người khác như Ss, ví dụ, nhưng nó không phác thảo mọi đánh giá nhân vật.)

+0

có thể chạy truy vấn mysql và cho mysql biết collation để sử dụng cho chuỗi được truyền cho nó, do đó, để chạy so sánh trên máy chủ mysql. có thể không nhanh nhưng sẽ tạo ra hành vi chính xác. – hakre

+0

Tôi nên thêm hiệu quả đó là điều quan trọng nhất. – Thor

Trả lời

0

Bạn đã xem lớp đối chiếu PHP chưa? http://www.php.net/manual/en/class.collator.php

+0

Điều đó thật thú vị. Tôi không biết điều đó tồn tại. Than ôi, tôi không thể tìm ra từ tài liệu mà các cài đặt sẽ hoạt động giống như MySQL. Ngoài ra, tôi đoán tôi quan tâm nhiều hơn đến việc có thể tuân thủ các chuỗi, điều này sẽ cho phép khả năng so sánh một chuỗi với một khóa mảng chẳng hạn. – Thor

3

Đây là những gì tôi đã sử dụng, nhưng tôi chưa thử nghiệm nó để hoàn toàn nhất quán với MySQL.

function collation_conform($string,$collation='utf8_general_ci') 
{ 

    if($collation === 'utf8_general_ci') 
    { 
     if(!is_string($string)) 
      return $string; 

     $string = strtr($string, array(
      'Š'=>'S', 'š'=>'s', 'Ð'=>'D', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 
      'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 
      'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 
      'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss','à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 
      'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 
      'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 
      'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'ƒ'=>'f')); 

     return strtolower($string); 
    } 
    else die('Unsupported Collation (collation_conform() collation_helper.php)'); 
} 
-1

Hãy thử mã sau đây.

$s1 = 'Björk'; 
$s2 = 'bjork'; 

var_dump(
    is_same_string($s1, $s2) 
); 

function is_same_string($str, $str2, $locale = 'en_US') 
{ 
    $coll = collator_create($locale); 
    collator_set_strength($coll, Collator::PRIMARY); 
    return 0 === collator_compare($coll, $str, $str2); 
} 
+0

Đó là "Làm thế nào để mô phỏng MySQLs utf8_general_ci collation [...]" và bạn đã trả lời với '$ locale = 'en_US''. Bạn có chắc hai cái này bằng nhau không? Trong utf8_general_ci 'a' = 'ą' nhưng 'L'! = 'Ł' ... – Kalmar

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