【问题标题】:determine if a string contains one of a set of words in an array确定字符串是否包含数组中的一组单词之一
【发布时间】:2009-12-17 03:31:06
【问题描述】:

我需要一个简单的单词过滤器,如果它在字符串中检测到过滤的单词,它将杀死脚本。

说我的话如下

$showstopper = array(badword1, badword2, badword3, badword4);

$yourmouth = "im gonna badword3 you up";

if(something($yourmouth, $showstopper)){ 
//stop the show
}

【问题讨论】:

    标签: php


    【解决方案1】:

    您可以将坏词数组内爆到正则表达式中,然后查看它是否与大海捞针匹配。或者您可以简单地循环遍历数组,并单独检查每个单词。

    来自 cmets:

    $re = "/(" . implode("|", $showstopper) . ")/"; //  '/(badword1|badword2)/'
    if (preg_match($re, $yourmouth) > 0) { die("foulmouth"); }
    

    【讨论】:

    • $re = "/(" . implode("|", $showstopper) . ")/"; if (preg_match($re, $yourmouth) > 0) { die("foulmouth"); }
    【解决方案2】:

    in_array() 是你的朋友

        $yourmouth_array = explode(' ',$yourmouth);
        foreach($yourmouth_array as $key=>$w){
           if (in_array($w,$showstopper){
             // stop the show, like, replace that element with '***'
             $yourmouth_array[$key]= '***';
           }
        }
    $yourmouth = implode(' ',$yourmouth_array);
    

    【讨论】:

    • -1,strpos() 和 str_replace() 在这种情况下是更好的朋友。
    【解决方案3】:

    您可能希望将此与 foreachpreg_match 方法进行基准测试。

    $showstopper = array('badword1', 'badword2', 'badword3', 'badword4');
    $yourmouth = "im gonna badword3 you up";
    
    $check = str_replace($showstopper, '****', $yourmouth, $count);
    if($count > 0) { 
         //stop the show
    }
    

    【讨论】:

      【解决方案4】:

      一个快速的解决方案涉及检查键,因为这不需要遍历数组。但是,这需要修改您的坏词列表。

      $showstopper = array('badword1' => 1, 'badword2' => 1, 'badword3' => 1, 'badword4' => 1);
      $yourmouth = "im gonna badword3 you up";
      
      // split words on space
      $words = explode(' ', $yourmouth);
      foreach($words as $word) {
          // filter extraneous characters out of the word
          $word = preg_replace('/[^A-Za-z0-9]*/', '', $word);
          // check for bad word match
          if (isset($showstopper[$word])) {
              die('game over');
          }
      }
      

      preg_replace 可确保用户不会通过键入 bad_word3 之类的内容来滥用您的过滤器。它还确保数组键检查不会爆炸。

      【讨论】:

        【解决方案5】:

        不知道你为什么需要这样做,但这里有一种方法可以检查并获取所使用的坏词

        $showstopper = array(badword1, badword2, badword3, badword4);
        $yourmouth = "im gonna badword3 you up badword1";
        
        function badWordCheck( $var ) {
        
            global $yourmouth;
            if (strpos($yourmouth, $var)) {
                return true;
            }
        
        }
        
        print_r(array_filter($showstopper, 'badWordCheck'));
        

        array_filter() 返回一个坏词数组,所以如果它的 count() 为 0 则表示不坏

        【讨论】:

          猜你喜欢
          • 2018-06-11
          • 1970-01-01
          • 2012-11-21
          • 2016-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-27
          相关资源
          最近更新 更多