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。