尝试检查用户的输入是否包含禁止的字词
创建数组,例如$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;。所以,如果我已经有一些过滤东西的代码,我将使用代码。但尝试创建一些代码似乎是不合理的。另一方面,必须过滤垃圾邮件发送者和坏文本发件人。
答案 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/>";
}
}