10/10/2018, 10:27

Đoạn code tự động lọc bỏ bài viết viết bằng tiếng Việt không dấu?

Trên diễn đàn có quy định phải viết bằng tiếng Việt có dấu, tuy nhiên có khá nhiều bài viết vẫn sử dụng tiếng Việt không dấu. Không biết có ai có cách nào (đoạn code hoặc ý tưởng) để tự động lọc bỏ các bài viết viết bằng tiếng Việt không dấu hay không?

Có khả thi hay không nếu dùng phương pháp lọc từng chữ và so mã để tìm xem có các chữ như "á", "à", "ả", "ạ", "ê", "ể",...? Đầu tiên là liệt kê hết tất cả các trường hợp nguyên âm dùng trong tiếng Việt và rồi so sánh để tìm. Nếu không có chữ nào thì xóa bỏ?
sacroyant viết 12:29 ngày 10/10/2018
Bạn có thể sử dụng hàm stripVietnameseAccent của bác sim dưới đây

PHP Code:
static public function stripVietnameseAccent ($inputString) {
        
// Bảng dịch ký tự không dấu bao gồm 2 bảng mã cho unicode và windows cp 1258
        
$trans = array (
                        
'á' => 'a''à' => 'a''ả' => 'a''ã' => 'a''ạ' => 'a'
                        
'Á' => 'A''À' => 'A''Ả' => 'A''Ã' => 'A''Ạ' => 'A',
                        
            
'â' => 'a''ấ' => 'a''ầ' => 'a''ẩ' => 'a''ẫ' => 'a''ậ' => 'a',
            
'Â' => 'A''Ấ' => 'A''À' => 'A''Ẩ' => 'A''Ẫ' => 'A''Ậ' => 'A',
            
            
'ă' => 'a''ắ' => 'a''ằ' => 'a''ẳ' => 'a''ẵ' => 'a''ặ' => 'a',
            
'Ă' => 'A''Ắ' => 'A''Ằ' => 'A''Ẳ' => 'A''Ẵ' => 'A''Ặ' => 'A',
            
                        
'é' => 'e''è' => 'e''ẻ' => 'e''ẽ' => 'e''ẹ' => 'e',
                        
'É' => 'E''È' => 'E''Ẻ' => 'E''Ẽ' => 'E''Ẹ' => 'E',
                        
            
'ê' => 'e''ế' => 'e''ề' => 'e''ể' => 'e''ễ' => 'e''ệ' => 'e'
            
'Ê' => 'E''Ế' => 'E''Ề' => 'E''Ể' => 'E''Ễ' => 'E''Ệ' => 'E',
            
                        
'í' => 'i''ì' => 'i''ỉ' => 'i''ĩ' => 'i''ị' => 'i'
                        
'Í' => 'I''Ì' => 'I''Ỉ' => 'I''Ĩ' => 'I''Ị' => 'I',
                                    
                        
'ó' => 'o''ò' => 'o''ỏ' => 'o''õ' => 'o''ọ' => 'o'
                        
'Ó' => 'O''Ò' => 'O''Ỏ' => 'O''Õ' => 'O''Ọ' => 'O',
                        
            
'ơ' => 'o''ớ' => 'o''ờ' => 'o''ở' => 'o''ỡ' => 'o''ợ' => 'o',
            
'Ơ' => 'O''Ớ' => 'O''Ờ' => 'O''Ở' => 'O''Ỡ' => 'O''Ợ' => 'O',
            
            
'ô' => 'o''ố' => 'o''ồ' => 'o''ổ' => 'o''ỗ' => 'o''ộ' => 'o'
            
'Ô' => 'O''Ố' => 'O''Ồ' => 'O''Ổ' => 'O''Ỗ' => 'O''Ộ' => 'O',
            
                        
'ú' => 'u''ù' => 'u''ủ' => 'u''ũ' => 'u''ụ' => 'u'
                        
'Ú' => 'U''Ù' => 'U''Ủ' => 'U''Ũ' => 'U''Ụ' => 'U',
                        
            
'ư' => 'u''ứ' => 'u''ừ' => 'u''ử' => 'u''ữ' => 'u''ự' => 'u',
            
'Ư' => 'U''Ứ' => 'U''Ừ' => 'U''Ử' => 'U''Ữ' => 'U''Ự' => 'U',
                        
                        
'ý' => 'y''ỳ' => 'y''ỷ' => 'y''ỹ' => 'y''ỵ' => 'y'
                        
'Ý' => 'Y''Ỳ' => 'Y''Ỷ' => 'Y''Ỹ' => 'Y''Ỵ' => 'Y',
                        
            
'đ' => 'd',
            
'Đ' => 'D',
           
            
' ' => '-' 
            
);
        
        
// Dịch Tiếng Việt có dấu thành không dấu theo 2 bảng mã Unicode va window cp 1258
        
return strtr $inputString$trans ); // Chuỗi đã được bỏ dấu 
    

ngoc_viet08 viết 12:27 ngày 10/10/2018
bác sacroyant hình như đọc ko kĩ request rồi
có phải tiếng việt là phải có dấu đâu pa.
vd : tui ko bik nha !
vv.vv..v..
khonggiannet viết 12:30 ngày 10/10/2018
Giả sử nội dung bài viết chứa trong biến $content

PHP Code:
if (mb_trlen($content'utf-8')>200)
{
  if (
$content không chứa kí tự có dấu nào
    
AND $content không chứa các kí tự tiếng Anh phổ biến như theanysomeitthatthis...)
    return 
'Tieng Viet khong dau';
}

return 
'OK'
Không có cách nào hoàn toàn chính xác và chỉ nên kiểm tra với các bài viết dài thôi. Vì một câu tiếng Việt ngắn vẫn có thể không có dấu. Sau 200 kí tự mà không tìm thấy dấu thì nhiều khả năng là tiếng Việt không dấu (hoặc tiếng Anh ).
sacroyant viết 12:33 ngày 10/10/2018
Được gửi bởi ngoc_viet08
bác sacroyant hình như đọc ko kĩ request rồi
có phải tiếng việt là phải có dấu đâu pa.
vd : tui ko bik nha !
vv.vv..v..
Ai bảo tôi không đọc kỹ!

Thoạt nhìn, tưởng như hàm stripVietnameseAccent mà tôi giới thiệu không liên quan gì đến yêu cầu của bạn, nhưng ngược lại, tôi khẳng định là nó có thể giải quyết được vấn đề theo cách nào đó

Cái chúng ta cần là một chút khả năng liên tưởng.

Để tôi gợi ý nhé. Giả sử site của bạn là 1 hệ thống tài chính. Trên thế giới có 2 loại tiền tệ là USD và VND, nhưng hệ thống của bạn chỉ chấp nhận USD. Hàm stripVietnameseAccent làm nhiệm vụ đổi tiền từ USD sang VND theo tỷ giá 1 USD = 18,000 VND. Cái gì liên quan ở đây ?

Tiền đưa vào stripVietnameseAccent sẽ luôn trả về VND. Cho nên :

1, Nếu ai đó đưa vào 10 USD thì nó sẽ trở thành 180,000 VND.

2, Nếu ai đó đưa vào 10 VND thì vẫn là 10 VND.

Nghĩa là, stripVietnameseAccent ngoài việc đổi tiền còn có thể giúp bạn xác định loại tiền đưa vào là USD hay VND.

Như thế, vấn đề đã được giải quyết
snoob_clo4 viết 12:43 ngày 10/10/2018
Được gửi bởi sacroyant
Nghĩa là, stripVietnameseAccent ngoài việc đổi tiền còn có thể giúp bạn xác định loại tiền đưa vào là USD hay VND.

Như thế, vấn đề đã được giải quyết
Có thể kiểm tra thêm số kí tự, nếu bài quá ngắn thì không kiểm tra cho nó chính xác
sacroyant viết 12:40 ngày 10/10/2018
Được gửi bởi snoob_clo4
Có thể kiểm tra thêm số kí tự, nếu bài quá ngắn thì không kiểm tra cho nó chính xác
Ừ, chính thế.

Nếu dài hơn 50 char thì cho chạy qua stripVietnameseAccent, sau đó đối chiếu 2 chuỗi trước và sau khi lọc dấu. Nếu trùng nhau thì rất có khả năng chuỗi ban đầu là 1 chuỗi không dấu
snoob_clo4 viết 12:38 ngày 10/10/2018
Code:
<?php
/**
 * @author Snoob
 * @copyright 2010
 */
//Hàm kiểm tra
function checkVietnamese($docs)
{
    //Bảng chữ cái có dấu (blcn: Copy muốn gãi cả tay)
    $pattern = '/á|à|ả|ã|ạ|â|ấ|ầ|ẩ|ẫ|ậ|ă|ắ|ằ|ẵ|ặ|é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ|í|ì|ỉ|ĩ|ị|ó|ò|ỏ|õ|ọ|ơ|ớ|ờ|ở|ỡ|ợ|ô|ố|ồ|ổ|ỗ|ộ|ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự|ý|ỳ|ỷ|ỹ|v|ỵ|đ/im';
    // If trên 5 chữ thì check
    if (count(explode(" ", $docs)) > 5) {
        //Nếu có chữ nào trùng trong bản thì đích thị là nó
        if (preg_match($pattern, $docs))
            return true;
        //Không thì chịu
        else
            return false;
    }
    // Dưới 5 chữ, bỏ kiểm, duyệt!
    else
        return true;
}
?>
Của bác đây, hehe
P/S:Lục nghề hết rùi, code có đoạn ít xịu mà mất 1 tiếng nản thiệt.
=====
Đã sửa
Brantanna viết 12:42 ngày 10/10/2018
Cám ơn tất cả các bạn!
Cách làm các bạn nêu ra cũng gần giống ý của mình: lọc tìm tiếng Việt có dấu trong 1 đoạn bài viết, nếu có xuất hiện các nguyên âm có dấu thanh thì bài viết có gõ bằng tiếng Việt không dấu, còn không thì tìm tiếp qua từ khác cho đến khi hết bài viết.

Ý mình hỏi là vì làm cách này hơi dài, không biết có cách nào ngắn gọn hơn hay không?

Dù sao cũng cảm ơn các bạn rất nhiều.
zmt264 viết 12:41 ngày 10/10/2018
Được gửi bởi sacroyant
Ai bảo tôi không đọc kỹ!

Thoạt nhìn, tưởng như hàm stripVietnameseAccent mà tôi giới thiệu không liên quan gì đến yêu cầu của bạn, nhưng ngược lại, tôi khẳng định là nó có thể giải quyết được vấn đề theo cách nào đó

Cái chúng ta cần là một chút khả năng liên tưởng.

Để tôi gợi ý nhé. Giả sử site của bạn là 1 hệ thống tài chính. Trên thế giới có 2 loại tiền tệ là USD và VND, nhưng hệ thống của bạn chỉ chấp nhận USD. Hàm stripVietnameseAccent làm nhiệm vụ đổi tiền từ USD sang VND theo tỷ giá 1 USD = 18,000 VND. Cái gì liên quan ở đây ?

Tiền đưa vào stripVietnameseAccent sẽ luôn trả về VND. Cho nên :

1, Nếu ai đó đưa vào 10 USD thì nó sẽ trở thành 180,000 VND.

2, Nếu ai đó đưa vào 10 VND thì vẫn là 10 VND.

Nghĩa là, stripVietnameseAccent ngoài việc đổi tiền còn có thể giúp bạn xác định loại tiền đưa vào là USD hay VND.

Như thế, vấn đề đã được giải quyết

Làm như bác thì nó lọc cả ai viết in English :P

Có 2 thứ: 1 là phát hiện ra người ta viết ko dấu, và 2 là người ta viết tiếng Việt. Nói chung làm chức năng này chỉ chậm server , tốt nhất làm nút cảnh báo, ai viết láo + không dấu + ... => thành viên cảnh báo.
Bài liên quan
0