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