类似于strpos()的数组?

时间:2014-01-06 04:56:51

标签: php arrays strpos

我最近收到了很多来自我的联系表单的垃圾邮件,因此我决定在表单的“消息”部分添加一些验证。我编写了一个函数,我认为可以用来清除我在表单中垃圾电子邮件中看到的最常用的单词,但是当我运行它时它总是返回false。

这是功能:

function spamCheck($input) {
    $flags = array('cialis', 'viagra', 'erection', 'pharmac', 'porn', 'anal', 'bondage', 'insurance', 'ringtone', 'poker', 'casino', 'gambl', 'whore', 'nipple', 'shit', 'realt', 'shemale', 'valium');
    $input = explode(' ', $input);
    foreach($input as $word) {
        $word = trim($word, '",.!?\';:*');
        foreach($flags as $flag) {
            if(strpos(strtolower($word), $flag)) {
                return $word;
                exit;
            }
        }
    }
    return false;
}

您会注意到黑名单中的某些字词不完整。例如“gambl”,可以通过电子邮件发送为“赌博”或“赌博”或“赌徒”或“赌博”或“赌博”。这就是为什么我在foreach循环中使用strpos(),以便它匹配部分字符串,而不仅仅是精确的字符串。

任何想法导致失败的原因是什么?

4 个答案:

答案 0 :(得分:1)

以下内容应该有效:

function spamCheck($input){
    $flags = array('cialis', 'viagra', 'erection', 'pharmac', 'porn', 'anal', 'bondage', 'insurance', 'ringtone', 'poker', 'casino', 'gambl', 'whore', 'nipple', 'shit', 'realt', 'shemale', 'valium');
    $input = explode(' ', $input);
        foreach($input as $word){
        $word = trim($word, '",.!?\';:*');
            foreach($flags as $flag){
                if(strpos(strtolower($word), $flag) !== false){
                return $word;
                }
            }
        }
    return false;
}

$spam = spamCheck("Download free ringtones for your mobile phone.");
print($spam); // will print "ringtones"

详细了解strpos的返回值。

更新:相当于您的函数的正则表达式:

function spamCheck($input){
    $flags = array('cialis', 'viagra', 'erection', 'pharmac', 'porn', 'anal', 'bondage', 'insurance', 'ringtone', 'poker', 'casino', 'gambl', 'whore', 'nipple', 'shit', 'realt', 'shemale', 'valium');
    $pattern = "/\\b[a-z]*(?:".implode("|", $flags).")[a-z]*\\b/i";
        if(preg_match($pattern, $input, $matches)){
        return $matches[0];
        }
    return false;
}

答案 1 :(得分:0)

试试这个

function spamCheck($input) {
$flags = array('cialis', 'viagra', 'erection', 'pharmac', 'porn', 'anal', 'bondage', 'insurance', 'ringtone', 'poker', 'casino', 'gambl', 'whore', 'nipple', 'shit', 'realt', 'shemale', 'valium');
$input = explode(' ', $input);
foreach($input as $word) {
    $word = trim($word, '",.!?\';:*');
     foreach($flags as $fl){
      if(strpos($word,$fl) !== false ){ // edited as user requested
          return $word;
     }
}
}
return false;

}

答案 2 :(得分:0)

你最好在preg_replace中使用正则表达式。进行手动字符串搜索会影响效率并使许多边缘情况得不到解决。

答案 3 :(得分:0)

一些修改并且有效:

    function spamCheck($input) {
    $flags = array('cialis', 'viagra', 'erection', 'pharmac', 'porn', 'anal', 'bondage', 'insurance', 'ringtone', 'poker', 'casino', 'gambl', 'whore', 'nipple', 'shit', 'realt', 'shemale', 'valium');

    $input = preg_replace('/[",.!?\';:*]/', '', $input);

    $input = explode(' ', $input);

    foreach($input as $word) {
      foreach($flags as $flag) {
        if(strpos(strtolower($word), $flag) !== false) {
          return $word;
        }
      }   
    }
    return false;
}