【问题标题】:PHP check if there is a repeated part in stringPHP检查字符串中是否有重复部分
【发布时间】:2012-04-23 13:13:47
【问题描述】:

我正在尝试阻止垃圾邮件,其中很多是重复出现的单词,有没有办法检查字符串以查看字符串中是否有重复出现的短语?

$string = 'Hello ! Hello ! Hello ! Hello !";

谢谢,

【问题讨论】:

  • 如何使用akismet 而不是推出自己的反垃圾邮件解决方案?我曾经为通用文本编写过垃圾邮件过滤器,如果没有误报,很难过滤。 Akismet 可以使用了。

标签: php arrays string spam


【解决方案1】:

substr_count 当您知道自己在寻找什么时就可以了。如果不知道什么是垃圾词,可以使用str_word_countarray_count_values

$string = 'Hello! Hello! Hello! Hello! Lorem Ipsum';
$words = str_word_count($string, 1);
$count = array_count_values($words);
print_r($count);

这会给你这个:

Array
(
    [Hello] => 4
    [Lorem] => 1
    [Ipsum] => 1
)

你可以sort()这个数组,得到字符串上最常用词的排名。您还应该检查停用词(如“and”、“or”、“me”等)。

【讨论】:

  • 如果其中一个词被使用超过 10 次,如果有任何方法可以执行功能,不包括常见的这些词:like a, the, my, he, she, that
  • 您需要一个数组中的停用词列表,然后遍历$count 列表。我相信没有 PHP 函数可以自己解决停用词问题。或许array_filter可以帮到你。
【解决方案2】:

快速的 Google 搜索让我知道:

http://php.net/manual/en/function.substr-count.php

但是,有更好的反垃圾邮件想法。就像验证码一样。人类垃圾邮件发送者很难捕获。他们会找到绕过您的单词计数器的方法。也许你应该考虑像 Youtube 那样基于用户的垃圾邮件报告方法。

【讨论】:

    【解决方案3】:

    你可以试试 substr_count(): http://php.net/manual/en/function.substr-count.php

    $string = 'hello ! hello ! hello ! hello !';
    echo substr_count($string, 'hello');
    

    当然,如果您想检查字符串中的任何单词是否多次出现...那么效率会大大降低。您可能必须跟踪“已检查单词”列表,并且对于字符串中的每个尚未检查的单词,检查它是否出现多次。

    就像 Binarious 提到的,验证码是阻止垃圾邮件的更好方法;-)

    【讨论】:

    • 问题是,我不知道重复的字符串是什么。我以为它有一个布尔函数......
    猜你喜欢
    • 2023-03-31
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2018-10-17
    相关资源
    最近更新 更多