07/09/2018, 10:49

Chuyển Ký Tự Unicode Về ASCII Khi Tạo SEO Friendly URL Trong PHP

Khi tạo URL cho bài viết trong một ứng dụng dạng blog các nhân thông thường chúng ta sẽ sử dụng chính tiêu đề bài viết và loại bỏ các ký tự đặc biệt trên URL và thay bằng ký tự -. Các ký tự đặc biệt thường thấy như khoảng trắng chuyển thành %20, hoặc dấu +... Ví dụ tiêu đề bài viết như sau: This ...

Khi tạo URL cho bài viết trong một ứng dụng dạng blog các nhân thông thường chúng ta sẽ sử dụng chính tiêu đề bài viết và loại bỏ các ký tự đặc biệt trên URL và thay bằng ký tự -. Các ký tự đặc biệt thường thấy như khoảng trắng chuyển thành %20, hoặc dấu +... Ví dụ tiêu đề bài viết như sau:

This is example article

Thì chúng ta sẽ chuyển về thành

This-is-example-artile 

Yêu cầu trên có thể được thực hiện khá đơn giản ví dụ sư dụng hàm substr() trong PHP. Tuy nhiên một trường hợp mà các dev thường gặp đối với bài viết sử dụng ngôn ngữ tiếng Việt đó là trong tiêu đề bài viết có các ký tự lạ. Do thuật toán tìm kiếm của Google ưu tiên các ký tự ASCII hơn Unicode trong URL nên chúng ta cần chuyển các ký tự đặc biệt theo mã Unicode này về ký tự ASCII.

PHP không có sẵn hàm nào hỗ trợ xử lý công việc trên do đó chúng ta cần viết riêng một hàm, để làm điều này chúng ta thông qua hai bước đơn giản sau:

  • Tạo một mảng array để map các ký tự Unicode về ký tự ASCII.
  • Tìm và thay thế các ký tự Unicode về ký tự ASCII.

Map Ký Tự Unicode Về ASCII

Đầu tiên chúng ta sẽ tạo một biến dạng array để map các ký tự Unicode về các ký tự ASCII:

$asciiUnicodeMap = array(
        'a'=>'á|à|ả|ã|ạ|ă|ắ|ặ|ằ|ẳ|ẵ|â|ấ|ầ|ẩ|ẫ|ậ',
       'd'=>'đ',
       'e'=>'é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ',
       'i'=>'í|ì|ỉ|ĩ|ị',
       'o'=>'ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ',
       'u'=>'ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự',
       'y'=>'ý|ỳ|ỷ|ỹ|ỵ',
       'A'=>'Á|À|Ả|Ã|Ạ|Ă|Ắ|Ặ|Ằ|Ẳ|Ẵ|Â|Ấ|Ầ|Ẩ|Ẫ|Ậ',
       'D'=>'Đ',
       'E'=>'É|È|Ẻ|Ẽ|Ẹ|Ê|Ế|Ề|Ể|Ễ|Ệ',
       'I'=>'Í|Ì|Ỉ|Ĩ|Ị',
       'O'=>'Ó|Ò|Ỏ|Õ|Ọ|Ô|Ố|Ồ|Ổ|Ỗ|Ộ|Ơ|Ớ|Ờ|Ở|Ỡ|Ợ',
       'U'=>'Ú|Ù|Ủ|Ũ|Ụ|Ư|Ứ|Ừ|Ử|Ữ|Ự',
       'Y'=>'Ý|Ỳ|Ỷ|Ỹ|Ỵ',
);

Mảng ở trên là một mảng liên kết (associative array) bao gồm tất cả 14 phần tử với mối phần tử có các key là giá trị của ký tự ASCII sẽ được chuyển đổi từ các ký tự Unicode tương ứng là giá trị (value) ứng với key này. Ở đây mỗi key sẽ ứng với một và chỉ một ký tự ASCII và nó sẽ được map với nhiều ký tự Unicode khác nhau. Ví dụ key của phần tử đầu là a sẽ được map với nhiều ký tự như Á, À, Ả...

Ngoài ra mỗi ký tự nằm trong value của key sẽ được phân cách bởi dấu |. Điều này để giúp chúng ta thực hiện việc tìm kiếm và thay thế mà bạn sẽ tìm hiểu ở bước tiếp theo.

Tìm Và Thay Thế Ký Tự Unicode bởi ASCII

Sau khi đã tạo ra một mảng array để map các ký tự Unicode với các ký tự ASCII thì việc tiếp theo chúng ta cần làm đó là tìm kiếm trong chuỗi sử dụng để tạo ra URL (tiêu đề bài viết) những ký tự Unicode và chuyển về ký tự ASCII. Chúng ta làm việc này thông qua sử dụng hàm preg_replace() trong PHP:

<?php
function unicode_to_ascii($str)
{
      global $asciiUnicodeMap;
      foreach($asciiUnicodeMap as $ascii => $uni) {
           $str = preg_replace("/($uni)/i", $ascii, $str);
      }
       return $str;
}

Kết quả trả về của hàm trên sẽ là một chuỗi với chỉ các ký tự ASCII.

0