我有一个文件中的大量电子邮件地址列表。它有大约 100 万个电子邮件 ID。我有垃圾邮件、垃圾邮件等坏词列表,其中包含 20,000 多个坏词。
我需要验证电子邮件 ID。如果电子邮件 ID 中的任何位置出现坏词,它将被标记为无效。
例如;
testspam@gmail.com - 无效
newuser@desspam.com - 无效
我想知道哪种比较方法最快,因为数组循环需要时间。
我尝试了以下方法
//$keyword_list- array of bad words;
//$check_key- the email id which need to validate
$arrays = array_chunk($keyword_list, 2000);
for($i=0;$i<count($arrays);$i++)
{
if (preg_match('/'.implode('|', $arrays[$i]).'/', $check_key, $matches)){
return 1;
}
}
在比较 100 万个数据时,上述方法需要更多时间。
接下来我们尝试使用以下代码,这也需要更多时间
//$contain = bad words separated by '|'
// $str - the email id which need to validate
if(stripos($contain,"|") !== false)
{
$s = preg_split('/[|]+/i',$contain);
$len = sizeof($s);
for($i=0;$i < $len;$i++)
{
if(stripos($str,$s[$i]) !== false)
{
return(true);
}
}
}
if(stripos($str,$contain) !== false)
{
return(true);
}
return(false);
最后我尝试了 Mongodb 文本搜索。它可以快速解决以下问题
如果“地狱”是我的坏列表中的单词,并且我的电子邮件 ID 类似于 head@e-hellinglysussex.sch.uk,那么 Mongodb 文本搜索将不会匹配它。
这是我使用的代码;
$ret = $db->command( array("text" =>$section, "search" => $keyword_string, "limit"=>$cnt_finalnonmatch));
where $section = Collection name,
$keyword_string = Comparing keywords string separated by space, for eg "Hell Spam Junk" etc,
$cnt_finalnonmatch = total number of comparing email ids
请帮我解决这个问题。