Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查字符串是否包含垃圾邮件_Php_Arrays_Function - Fatal编程技术网

Php 检查字符串是否包含垃圾邮件

Php 检查字符串是否包含垃圾邮件,php,arrays,function,Php,Arrays,Function,我正在尝试实现堆栈溢出中的一些代码,它覆盖了一个垃圾词过滤器。当我只是键入一个垃圾词时,该函数会工作,但是当我在垃圾词通过之前键入一堆文本时,该函数会工作。我已经查过消息来源了,一定是漏掉了什么,有人能帮忙吗 代码是: function strpos_arr($haystack, $needle) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $what) { if(($pos

我正在尝试实现堆栈溢出中的一些代码,它覆盖了一个垃圾词过滤器。当我只是键入一个垃圾词时,该函数会工作,但是当我在垃圾词通过之前键入一堆文本时,该函数会工作。我已经查过消息来源了,一定是漏掉了什么,有人能帮忙吗

代码是:

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');
链接到原文:


谢谢

首先,看起来你的逻辑是错误的。我认为:

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;

首先,看起来你的逻辑是错误的。我认为:

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;

函数
strpos\u arr
返回在字符串中找到的第一个“针”的位置:

if(($pos = strpos($haystack, $what))!==false) return $pos;
false
如果文本中没有任何“针”

这意味着
strpos\u arr($text,$bad\u words)
如果文本中有任何坏单词,则返回
false
。否则,它将返回一个整数,其中包含字符串中第一个坏字的位置

请注意,当文本以坏单词开头时,它将返回一个
0
,这相当于
false
。这就是为什么当你“只是输入一个垃圾词时,这个函数就起作用了,而当我在垃圾词通过之前输入一堆文本时,这个函数就起作用了”

您可以实现一个函数来查找以下坏单词:

function has_bad_word($text, array $bad_words) {
    return strpos_arr($text, $bad_words) === false;
}
请注意,
strpos\u 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;
}

函数
strpos\u arr
返回在字符串中找到的第一个“针”的位置:

if(($pos = strpos($haystack, $what))!==false) return $pos;
false
如果文本中没有任何“针”

这意味着
strpos\u arr($text,$bad\u words)
如果文本中有任何坏单词,则返回
false
。否则,它将返回一个整数,其中包含字符串中第一个坏字的位置

请注意,当文本以坏单词开头时,它将返回一个
0
,这相当于
false
。这就是为什么当你“只是输入一个垃圾词时,这个函数就起作用了,而当我在垃圾词通过之前输入一堆文本时,这个函数就起作用了”

您可以实现一个函数来查找以下坏单词:

function has_bad_word($text, array $bad_words) {
    return strpos_arr($text, $bad_words) === false;
}
请注意,
strpos\u 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;
}

这更像是在错误信息中发现一个不好的词。是的,我想是这样的。我答案中的变化应该能解决问题。你试过了吗?我刚试过,效果很好,谢谢!答案已标记:)只需将“return$pos”更改为“return TRUE”,就会使函数名产生误导(它不会返回“字符串位置”)。“strpos_array”区分大小写,当指针中的任何字符串都是大海捞针中的子字符串时,它可能会返回true。这更像是一个坏字标记错误消息的情况。是的,我这么认为。我答案中的变化应该能解决问题。你试过了吗?我刚试过,效果很好,谢谢!答案已标记:)只需将“return$pos”更改为“return TRUE”,就会使函数名产生误导(它不会返回“字符串位置”)。“strpos_数组”区分大小写,当指针中的任何字符串都是草堆中的子字符串时,它可能返回true。