2014-10-14 8 views
1

Я пытаюсь реализовать немного кода, найденного при переполнении стека, который покрывает фильтр спам-слов. Когда я просто набираю спам-слово, функция работает, однако, когда я печатаю кучу текста до того, как оно будет пропущено. Я проверил источник, и я должен что-то упустить, может ли кто-нибудь помочь?Проверьте, содержит ли строка спам-слова

код:

function strpos_arr($haystack, $needle) { 
    if(!is_array($needle)) $needle = array($needle); 
    foreach($needle as $what) { 
    if(($pos = strpos($haystack, $what))!==false) return $pos; 
} 
return false; 
} 

функция Я звоню это вроде:

if(strpos_arr($text, $bad_words)) { 
     return false; 
    } else { 
     return true; 
    } 

массив только простой массив с большим количеством плохих слов, как так:

$bad_words = array(
     'bad word 1', 
     'bad word 2'); 

ссылка на оригинал: Using an array as needles in strpos

Thanks

ответ

2

Во-первых, похоже, что у вас есть своя логика в обратном направлении. Я думаю:

if(strpos_arr($text, $bad_words)) { 
    return false; 
} else { 
    return true; 
} 

должен быть:

if (strpos_arr($text, $bad_words)) { 
    return TRUE; 
} else { 
    return FALSE; 
} 

Затем вы возвращаетесь $pos если плохое слово найдено. Если $pos окажется равным нулю, он не сможет выполнить следующую проверку. Если вам не нужно знать положение плохого слова в тексте, я хотел бы изменить его:

if (($pos = strpos($haystack, $what)) !== FALSE) return TRUE; 
+0

Это скорее случай, если обнаружено неправильное слово. – jamper

+0

Да, я так и думал. Изменения в моем ответе должны разобраться. Ты это пробовал? – danmullen

+1

Я просто сделал, отлично работает, спасибо! ответ помечен :) – jamper

2

Функция strpos_arr возвращает позицию первого «игла», которая находится в строке:

if(($pos = strpos($haystack, $what))!==false) return $pos; 

или false, если в тексте нет «игл».

Это означает, что strpos_arr($text, $bad_words) возвращает false, если в тексте есть плохие слова. В противном случае он возвращает целое число с положением первого плохого слова в строке.

Обратите внимание, что когда текст начинается с плохого слова, он вернет 0, что эквивалентно false. Вот почему, когда вы просто вводите спам-слово, функция работает, когда я набираю кучу текста до того, как оно будет передано спам-слову ».

Вы могли бы реализовать функцию, чтобы найти плохие слова, как это:

function has_bad_word($text, array $bad_words) { 
    return strpos_arr($text, $bad_words) === false; 
} 

Обратите внимание, однако, что strpos_arr чувствителен к регистру и вернет true, когда любая строка из иглы подстроки в стоге сена, даже если это часть более крупного слова. Эта функция решает обе проблемы:

function has_bad_word($text, array $bad_words) { 
    $pregQuotedBadWords = array_map('preg_quote', $bad_words, array('/')); 
    $badWordsRegex = '/((\s+|^)' 
        . join('(\s+|$))|((\s+|^)', $pregQuotedBadWords) 
        . '(\s+|$))/is'; 
    return preg_match($badWordsRegex, $text) > 0; 
} 
Смежные вопросы