【问题标题】:regular expression to check for spammer用于检查垃圾邮件发送者的正则表达式
【发布时间】:2015-03-23 03:48:48
【问题描述】:

我正在尝试找出 preg_match() 的正则表达式,它将在以下所有情况下返回 true:

1- 为执行此操作的人去除空格“查看我的网站 .com(无空格)”

2- 在“check out mywebsite.com”中找到明显的“mywebsite.com”

3- 查找点替换“查看 mywebsite 点 com(无空格)”

4- 不区分大小写

【问题讨论】:

  • 我目前只能使用 str_replace 来替换空格和“点”,然后执行 preg_match("#mywebsite.com#i",$strReplaceResult)
  • PCRE 修饰符 'i' 解决了 #4。 php.net/manual/en/reference.pcre.pattern.modifiers.php 你想实际匹配“检查我的 TEXT.com”,在这些词之间有可选的空格?
  • 我的目标是,我想建立一个已知网站垃圾邮件发送者的数据库,并使用 $domain 遍历它们并通过正则表达式测试以确定输入字段是否返回 true 是否为 $ 垃圾邮件域...这是我的最终目标。我想 str_replace 和 preg_match 方法会起作用,但我想知道它是否可以用一个正则表达式完成

标签: php regex


【解决方案1】:

这对你有用吗?我认为您将来必须对其进行修改,但是对于粗略的实施(您所要求的)它应该可以工作。我还假设您的“检查我的”是必需的文本,如果不是可以删除的话。 \s* 表示任意数量的空格; \w* 表示任意数量的单词字符(a-z、0-9 和/或下划线)。 | 表示“或”,() 将“或”应该影响的两个值分组。如果您有任何问题,请提出。最外面的括号将潜在域分组。您可能想将 \w* 更改为 \w+,但我想如果他们说“检查我的 .com”,您还想过滤它...

if(preg_match('~check\s*out\s*my\s*(\w*\s*(\.|dot)\s*com)~i', $input, $domain)) {
     echo 'This is spam?';
}

基于您的实际代码的解决方案:

<?php
$spamCount=0;
$input=preg_replace(array('~\s*~', '~dot~i'), array('', '.'), 'Hi. Please see my website at "test domain . com" (no spaces) anothertest dot com');
$checkTheseDomains = array("testdomain.com","anothertest.com");
foreach($checkTheseDomains as $domain) {
    if(strpos($input, $domain) !== false) {
        $spamCount++;
    }
}
if($spamCount > 0){
        echo "Spam count of  <b>".$spamCount."</b>";
}else{
        echo "No spam";
}

【讨论】:

  • 这不适用于我的测试。即使我删除了 check\sout\smy\s* 部分,它似乎也没有在 $domain 中测试任何东西,特别是 pastebin.com/fAhZN5S8 每次都返回“无垃圾邮件”
  • 这不是 preg_match 的工作方式; php.net/manual/en/function.preg-match.php$input 是它正在检查的,$domain 是它捕获的。在您的示例中,您说“查看我的”,在此示例中您有“查看我的”,这些不匹配。
  • @b747fp 更新了替代解决方案,这行得通吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2012-03-06
  • 2018-11-23
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多