gpt4 book ai didi

php - 在脏话表中搜索单词,所有单词都会被标记

转载 作者:行者123 更新时间:2023-11-29 07:42:34 28 4
gpt4 key购买 nike

我的网站上有一个留言簿/评论系统的脏话数据库。它允许您输入您的姓名、电子邮件、消息和我自己的验证码。其中的名称、消息会公开显示,并且由于它是公开的,因此审核很重要。

我希望 PHP 在收到消息时像这样处理消息:

  1. 将消息转换为单词列表。
  2. 循环遍历数组中的每个字并执行命令/函数。该命令应该检查当前单词是否在数据库中
  3. 如果它在数据库中str_replace($bad_word, "[EXPLICIT]", $message)否则转到下一个单词并重复

到目前为止,我有这段代码,其中 $message 是用户消息:

$words_in_msg = explode(' ', $message);

foreach($words_in_msg as &$word) {
$res = mysqli_query($con,"
SELECT * FROM `badwords` WHERE `word` = '".$word."'
");
var_dump($res);
$num = mysqli_num_rows($res);
if ($num !== 0) {
$message = str_replace($word, "[EXPLICIT]", $message);
}
}

此代码大部分有效,因为它将列出 $message 中的所有单词,并且它将连接到数据库。但执行 SQL 命令后就会出现问题。我尝试使用 var_dump($res) 并得到了结果...但这不是我正在寻找的结果。 This这就是我得到的。

我实际上需要做的只是如果该单词在数据库中,则将其替换。

作为一个子问题,是否有另一种更优化的方法来执行相同的功能?考虑到有超过 1300 个单词需要扫描,我不确定这是否会太慢。

最佳答案

我有一些关于如何优化它的提示:

  1. 使用 array_unique 限制要检查的单词数:$words_in_msg = array_unique(explode(' ', $message));

  2. 仅运行一次查询,然后获取所有不良单词的数组。因此,将其移到循环之外。

  3. 在循环单词数组之前,首先执行 array_intersect 。如果结果数组为空,您可以停在那里,因为没有坏词。

  4. 如果有不好的单词,您可以使用当前循环,但不必每次都运行查询,而是使用:

    foreach($words_in_msg 为 $word) { if( in_array($w​​ord, $aryBadWords){ $message = str_replace($word, "[EXPLICIT]", $message); }}

或者,您可以使用单个正则表达式来执行所有替换

$regex = '/(' . implode('|', $words_in_msg) . ')/i';
$message = preg_replace($regex, '[EXPLICIT]', $message);

不运行每个单词的查询将是一个很大的改进。

关于php - 在脏话表中搜索单词,所有单词都会被标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28635942/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com