php试图检查用户的输入是否包含禁止的单词

时间:2015-02-22 10:07:39

标签: php

尝试检查用户的输入是否包含禁止的字词

创建数组,例如$prohibited_words = array{'hell'};

然后用户输入$input = 'Hello!';

和php

foreach ($prohibited_words as $one_prohibited_word) {
  if( stristr( substr( $input ), $one_prohibited_word ) !== FALSE ) {
    $error_message_words = 1;
    echo $one_prohibited_word. ' $one_prohibited_word <br/>';
  }
}

此处Hello显示为已禁止。

可能会更改if( stristr( substr( $input ), ($one_prohibited_word.' ') ) !== FALSE ) {

之类的内容

但可能是更好的解决方案吗?

更新 可能创建了一些疯狂的代码...

$bad_words_arr = array{'bad'};

访问者的输入

$user_input = ' Hello b a d word go  g g g on  a a a  again';

首先我替换空格。如果有多个空格,则用一个空格替换(我相信句子中的正常情况不能超过一个空格)。

然后根据空格创建数组。

这里我创建没有空元素和更改键顺序的新数组。

foreach( explode (' ', str_replace('  ',  ' ', $user_input) ) as     $value_new_arr ){
  if( strlen(trim($value_new_arr)) > 0 ){
    $arr_from_message_textarea[] = trim($value_new_arr);
  }
}

然后循环遍历数组的每个元素。

如果特定元素的字符串长度为1(一个字母只有一个字母/单词),则检查前一个循环中的字母数。如果在前一个循环中也有一个字母,那么将它们放在一起并创建新单词。

$temporary_string = '';
$new_word_already_started = 0;
foreach( $arr_from_message_textarea as $k_arr_from_message_textarea => $v_arr_from_message_textarea ){

if( $k_arr_from_message_textarea > 0 ){

  if( strlen($v_arr_from_message_textarea) == 1  ){//current element has only one letter

    if( strlen( $arr_from_message_textarea[$k_arr_from_message_textarea-1] ) == 1 ){//and previous element has only one letter

      if( $new_word_already_started == 0 ){
      $temporary_string = $arr_from_message_textarea[$k_arr_from_message_textarea-1]. $v_arr_from_message_textarea;//I started to create word. Put together two first letters
      $new_word_already_started = 1;
      }
      else if( $new_word_already_started == 1 ) {
      $temporary_string = $temporary_string.$v_arr_from_message_textarea;//Take previous letters 
      }

    }//if( strlen( $arr_from_message_textarea[$k_arr_from_message_textarea-1] ) == 1 ){
    else if( strlen( $arr_from_message_textarea[$k_arr_from_message_textarea-1] ) > 1 ){
    $temporary_string = '';//reset temporary string to start to use empty string
    $new_word_already_started = 0;
    }

  }//if( strlen($v_arr_from_message_textarea) == 1  ){

  else if( strlen($v_arr_from_message_textarea) > 1  ){//Imagine, in some previous loops were only one letter, created $temporary_string. In this loop word has more than one letter. So word from previous loops is created. Pass the word to array $new_word and reset $temporary_string to empty.
    if( strlen($temporary_string) > 0 ){
    $new_word[] = $temporary_string;
    }
  $temporary_string = '';
  $new_word_already_started = 0;
  }

}//if( $k_arr_from_message_textarea > 0 ){

}//foreach

if( isset($new_word) ){
//Merge initial array with the new array
$arr_to_check_bad_words = array_merge( ( explode (' ', str_replace( '  ',  ' ', str_replace('  ',  ' ', $user_input ) ) ) ), $new_word );
}
else{
$arr_to_check_bad_words = explode (' ', str_replace( '  ',  ' ', str_replace('  ',  ' ', $user_input ) ) );
}

$result_bad_words = array_intersect( $arr_to_check_bad_words, $bad_words_arr );// As understand get array of words from $arr_to_check_bad_words if the words exist in $bad_words_arr

不幸的是,如果$user_input = ' Hello ba d go g g g on a a a again';

,这不起作用

似乎很难获得所需的结果。在花了很多时间编写代码之后,可以看到访问者可以发送带有文本的消息,从中可以很容易地理解它包含&#34;坏词/坏意思&#34;。所以,如果我已经有一些过滤东西的代码,我将使用代码。但尝试创建一些代码似乎是不合理的。另一方面,必须过滤垃圾邮件发送者和坏文本发件人。

1 个答案:

答案 0 :(得分:3)

也许做这样的事情,你将输入分成一个单词数组,然后检查输入数组中的任何单词是否也出现在$prohibited_words数组中:

$prohibited_words = array('Hello!');
$input = 'Hello!';
$input_array = explode(' ', $input);
$intersect = array_intersect($prohibited_words, $input_array);

foreach ($intersect as $item) {
    echo "$item <br/>";
}

更强大的解决方案将涉及从输入字符串中删除所有空格,然后检查$prohibited_words数组中的任何项是否出现在已编辑的输入字符串中。您还可以使用strtolower()使搜索不区分大小写:

$prohibited_words = array('Hello!');    
$input = 'He ll   o!';
$new_input = str_replace(' ', '', strtolower($input));

foreach($prohibited_words as $item) {
    if (strpos($new_input, strtolower($item)) !== false) {
        echo "$item <br/>";
    }
}