Highlight từ khóa có hỗ trợ tiếng Việt không dấu sử dụng PHP

Trong các ứng dụng tìm kiếm nội dung như blog, diễn đàn, hoặc hệ thống lọc bài viết, việc tô sáng (highlight) từ khóa người dùng nhập vào là một tính năng hữu ích để cải thiện trải nghiệm người dùng. Tuy nhiên, với nội dung tiếng Việt – nơi có dấu và không dấu song hành – việc này không hề đơn giản.

Highlight từ khóa có hỗ trợ tiếng Việt không dấu sử dụng PHP

Hàm highlight_keyword() ra đời nhằm giải quyết vấn đề đó. Không chỉ tô sáng từ khóa trong đoạn văn bản, hàm này còn hỗ trợ so sánh không dấu tiếng Việt, giúp tăng độ chính xác và linh hoạt cho kết quả hiển thị.

Cách hoạt động của hàm

/**
 * Nổi bật từ khóa
 */
function highlight_keyword($text, $keyword) {
    if (empty($text) || empty($keyword)) return $text;

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

    // Tạo bản không dấu để tìm kiếm
    $original_text = $text;
    $text_no_diacritics = $remove_accents(mb_strtolower($text));
    $keyword_no_diacritics = $remove_accents(mb_strtolower($keyword));

    if (empty($keyword_no_diacritics)) return $text;

    $len = mb_strlen($keyword_no_diacritics);
    $offset = 0;
    $result = '';

    while (true) {
        $pos = mb_stripos($text_no_diacritics, $keyword_no_diacritics, $offset);
        if ($pos === false) {
            $result .= mb_substr($original_text, $offset);
            break;
        }

        $result .= mb_substr($original_text, $offset, $pos - $offset);
        $result .= '<mark>' . mb_substr($original_text, $pos, $len) . '</mark>';
        $offset = $pos + $len;
    }

    return $result;
}

Điểm đặc biệt ở đây là hàm sử dụng kỹ thuật loại bỏ dấu tiếng Việt bằng biểu thức chính quy (regex), sau đó sử dụng so sánh mb_stripos() để tìm vị trí từ khóa trong phiên bản không dấu. Khi đã xác định được vị trí trong văn bản gốc, hàm chèn thẻ <mark> để tô sáng từ khóa.

Ưu điểm nổi bật

  • Tô sáng từ khóa chính xác kể cả khi người dùng nhập không dấu.
  • Giữ nguyên định dạng gốc của văn bản (có dấu, hoa/thường).
  • Hỗ trợ đa byte (UTF-8), dùng được cho tiếng Việt, tiếng Nhật, v.v.
  • Dễ tích hợp vào WordPress hoặc bất kỳ hệ thống PHP nào.

Ví dụ sử dụng

$text = 'Bài viết về Sức khỏe và dinh dưỡng';
$keyword = 'suc khoe';
echo highlight_keyword($text, $keyword);

Kết quả:

Bài viết về <mark>Sức khỏe</mark> và dinh dưỡng

Hoặc bạn cũng có thể xem demo trực tiếp tại đây: tìm kiếm từ khóa “nam chính” tại DanhGiaTruyen.com (bạn cũng có thể thử với các từ khóa khác để kiểm tra độ chính xác).

Kết luận

Hàm highlight_keyword() là một công cụ nhỏ nhưng cực kỳ hiệu quả, đặc biệt phù hợp với các website tiếng Việt. Việc hỗ trợ so sánh không dấu giúp cải thiện đáng kể độ chính xác của hệ thống tìm kiếm hoặc lọc nội dung. Đây là một giải pháp bạn nên cân nhắc tích hợp vào các dự án PHP hoặc WordPress có yêu cầu thân thiện với tiếng Việt.

Chúc các bạn thành công!

Bình luận


  • Không có bình luận.