Cách so sánh chuỗi tiếng việt có dấu trong php

Thuật ngữ PCRE viết tắt của cụm từ Perl Compatible Regular Expression Nghĩa là các toán tử thông dụng tương thích với Perl. Nó có cái tên dài dòng như vậy vì nó có xuất xứ từ một ngôn ngữ cực kỳ xúc tích Perl và được dùng để xử lý với các thao tác trên chuỗi ký tự. Các hàm PCRE hay được biết đến dưới cái tên khác đó là các hàm preg vì chúng có chung một tiền tố preg. Dưới đây liệt kê các hàm preg và chức năng của chúng:

preg_filter: Thực hiện việc tìm kiếm và thay thế các ký tự trong một chuỗi preg_grep: Trả về kết quả là một mảng các phần tử mà thỏa mãn mẫu tìm kiếm (pattern) preg_last_error: Trả về mã lỗi của hàm PCRE vừa thực thi trước đó preg_match_all: Thực hiện hàm so sánh toàn diện từ đầu đến cuối preg_match: Thực hiện hàm so sánh và dừng lại sau khi thấy mẫu preg_quote: Thêm các dấu quote \ trước các ký tự đặc biệt preg_replace_callback: Thực hiện việc tìm kiếm mẫu, thay thế bằng một chuỗi ký bằng hàm preg_replace: Thực hiện việc tìm kiếm mẫu và thay thế bằng một chuỗi ký tự preg_split: Tách một chuỗi ký tự bằng các ký tự đặc biệt

Các hàm này cách sử dụng rất biến hóa. Bản thân tôi cũng chưa hiểu hết. Các bạn có thể tham khảo thêm ở http://www.php.net/manual/en/ref.pcre.php. Dưới đây tôi chỉ đi vào phân tích về cách viết chuỗi pattern theo quy ước của Perl và vận dụng vào hàm preg_replace để xử lý một số tình huống với chuỗi.

Quy ước về partern có một số dạng phổ biến như sau:

  • / và /

Định nghĩa bắt đầu và kết thúc một chuỗi mẫu. Ví dụ đoạn code sau đây sẽ tìm chuỗi mẫu “vdata” trong chuỗi ký tự “vdata là một công ty chuyên nghiệp” rồi thay thế bằng chuỗi “VDATA”.

Cách so sánh chuỗi tiếng việt có dấu trong php

Kết quả thu được là “VDATA là một công ty chuyên nghiệp”

  • dấu – kết hợp với [ ]

Dùng để xác định một khoảng các ký tự ví dụ /[a-z0-9]/ là chuỗi mẫu xác định các ký tự từ a đến z và từ 0 đến 9 là hợp lệ. Ví dụ sau đây tìm các ký tự số trong một chuỗi và thay loại bỏ (thay thế bằng ký tự trống). Đoạn code sau đây xóa bỏ số 7 trong chuỗi:

Cách so sánh chuỗi tiếng việt có dấu trong php

  • dấu ^

Dấu này dùng để phủ định các chuỗi đằng sau. Ví dụ muốn xác định mẫu là các ký tự khác a-z ta dùng đoạn mã sau:

Cách so sánh chuỗi tiếng việt có dấu trong php

Đoạn mã này sẽ cho kết quả là “ngyhuynghip”. Nguyên do là tất cả các chữ cái viết hoa, chữ số và dấu cách đều đã bị thay thế bằng ký tự trống.Lưu ý là ngay cả các chữ tiếng Việt có dấu cũng bị thay thế

  • chữ i

Chữ i được dùng để xác định cả chữ in hoa và chữ in thường. Ví dụ sau đây thay thế dấu $ bằng chữ “money”

Cách so sánh chuỗi tiếng việt có dấu trong php

Lưu ý các dấu cách ở trên được xác định sau chữ z nên không bị thay thế.

  • Dấu |

Khi muốn thể hiện hoặc chuỗi này hoặc chuỗi kia ta dùng dấu | ví dụ mẫu /abd|acd/ nghĩa là cần tìm kiếm chuỗi abd hoặc chuỗi acd. Cũng có thể dùng dẫu () để viết gọn hơn là /a(b|c)d/. Hãy tham khảo code dưới đây:

Cách so sánh chuỗi tiếng việt có dấu trong php

  • dấu { }

Dấu này dùng để chỉ ra số lượng các ký tự. Ví dụ sau đây tìm các chuỗi có chữ vdata, không phân biệt hoa hay thường và đằng trước nó có từ 3 đến 5 ký tự bất kỳ.

Cách so sánh chuỗi tiếng việt có dấu trong php

  • Các mẫu đặc biệt khác:

Một số mẫu đặc biệt khác cũng hay dùng như \d – các chữ số; \D không phải là các chữ số; \w – các từ; \W không phải là các từ; \s – các dấu cách; \S không phải các dấu cách; \n hoặc \r là các dấu xuống dòng. Ví dụ dưới đây minh họa cách sửa các dấu cách thành dấu gạch ngang

Cách so sánh chuỗi tiếng việt có dấu trong php

Còn nhiều các cách khai báo mẫu khác mà tôi cũng chưa biết hết, các bạn nếu biết thì comment thêm nhé. Cuối cùng tôi chỉ muốn lưu ý thêm là pattern và replacement có thể là một mảng gồm nhiều chuỗi khác nhau và sẽ được thay thế lần lượt từng phần tử như ví dụ dưới đây:

Hàm này ngược lại với hàm chop(), nó sẽ xóa đi kí tứ bên trái chuỗi và lưu ý rằng chỉ có thể tính từ các kí tự đứng đầu trong chuỗi.


3. PHP chunk_split (): Chia chuỗi thành các chuỗi nhỏ.

<?php
    $str = "I am Lam";
    echo chunk_split($str,1,".");
?> 

Kết quả:

  • Cho một biến $str chứa chuỗi: "I am Lam"
  • Thực hiện in ra với echo: gọi hàm chunk_split() với 3 tham số đầu vào, tham số đầu tiên (bắt buộc) truyền vào biến chuỗi, tham số thứ 2 và tham số thứ 3 (Không bắt buộc) là sau bao nhiêu chữ thì chèn vào nội dung trong ngoặc kép.

4. PHP lcfirst (): Chuyển kí tự đầu tiên thành chữ thường

<?php
echo lcfirst("I am Lam");
?> 

Kết quả:

  • Không có gì để nói nhiều về hàm này nhỉ
    Cách so sánh chuỗi tiếng việt có dấu trong php
    Đơn giản là truyền vào một chuỗi và từ nào đứng đầu chuỗi là chữ hoa thì nó ép sang chữ thường.

5. PHP similar_text (): Đếm số kí tự trùng nhau giữa hai chuỗi

<?php
echo similar_text("I am Lam","I am Linh");
?>

Kết quả trả về: 6 kí tự giống nhau.


6. PHP strcasecmp (): So sánh không phân biệt chữ hoa chữ thường

<?php
echo strcasecmp("I am Lam","I AM LAM");
?>
<p>Nếu hàm trả về 0, hai chuỗi so sánh không có khác biệt.</p>

Kết quả:

  • Và nếu như hai chuỗi có sự khác biệt thì hàm sẽ trả về số lượng kí tự khác biệt trong chuỗi.

7. PHP strchr (): Tìm kí tự trong chuỗi, trả về kí tự đó và phần còn lại

<?php
echo strchr("I am Lam, hello Lam","am");
?>

Kết quả:

  • Hàm strchr() sẽ tìm kí tự trong chuỗi, nếu tìm thấy nó sẽ thực hiện trả về kí tự đó và toàn bộ phần chuỗi phía sau kí tự vừa tìm được.

8. PHP strcmp (): So sánh hai chuỗi và phân biệt chữ hoa chữ thường

<?php
// 2 chuỗi bằng nhau
echo strcmp("I am Lam!","I am Lam!") . "<br>"; // => 0
//Phân biệt chữ hoa chữ thường và khi hoán đổi vị trí chuỗi
echo strcmp("i am lam!","I AM LAM!") . "<br>"; // => 32
echo strcmp("I AM LAM!","i am lam!") . "<br>"; // => -32
//Giảm độ dài ở một chuỗi và khi hoán đổi vị trí chuỗi
echo strcmp("I am Lam!","I am") . "<br>"; // => 5
echo strcmp("I am","I am Lam!") . "<br>"; // => -5
//Tăng độ dài ở một chuỗi và khi hoán đổi vị trí chuỗi
echo strcmp("I am Lam nhảm","I am Lam") . "<br>"; // => 7
echo strcmp("I am Lam","I am Lam nhảm") . "<br>"; // => -7
?> 

Kết quả:

Hàm strcmp () phân biệt chữ hoa chữ thường, nếu chuỗi thứ hai viết thường, kết quả trả về luôn là -32 và ngược lại