PHP嵌套数组搜索

时间:2011-06-19 09:12:45

标签: php

我是PHP的新手

我有一个像这样的数组

$suspiciousList = array(
array ("word" => "badword1", "score" => 400, "type" => 1), 
array ("word" => "badword2", "score" => 250, "type" => 1),
array ("word" => "badword3", "score" => 400, "type" => 1), 
array ("word" => "badword4", "score" => 400, "type" => 1));

当用户输入带有空格的单词(badw ord1,b adword2等)或者用户可能输入如(b a d w o r d 1)

时,我会遇到问题

如何从阵列(字典)中检测或搜索组合?

我的想法是让每个单词成为一个由空格分割的数组。

$ this-> suspiciousPart [] = $ word;

我正在编写以下功能

public function deepDetect2() {
    for($i=0;$i<sizeof($this->suspiciousPart);$i++) {
        $word = "";
        for($j=$i;$j<sizeof($this->suspiciousPart);$j++) {
            $word .= $this->suspiciousPart[$j];
            //var_dump($word);
            if(strpos(in_array($word, $this->suspiciousList), $word) !== false) {
                if($this->detect($word) == true) {
                    $i++;
                } else {
                    $j++;   
                }
            } else {
                $i++;
            }
        }
    }
}

任何人都有其他想法如何做到这一点?

由于

5 个答案:

答案 0 :(得分:2)

无论如何,您可以删除空白字符并使用(mb_substr_count(),但这会导致误报。

答案 1 :(得分:2)

正如Jirka Helmich建议您可以删除空格(以及其他特殊字符),然后搜索字符串以查找数组中的单词。

public function searchForBadWords($strippedText) {
     foreach($suspiciousList as $suspiciousPart) {
          $count = substr_count($strippedText, $suspiciousPart['word']);
          //you can use str_replace here or something, it depends what you want to achive
     }
}

问题是,如果你有像blablabad wordblabla这样的单词,你删除正常单词的空格可能会变成坏单词blablabadwordblabla(知道我的意思吗?):D

干杯

编辑:所以Ahmad我看到你只是在开头/结尾(快捷方式)中用“”来识别它们。也许您应该尝试使用单个单词来实现这两种方法,并使用子字符串搜索。这还取决于你对表现的关注程度。也许你应该尝试做一些研究,或者看看它的效果如何?:D

答案 2 :(得分:2)

  1. 剥离空间
  2. 使用包含所有关键字的一个正则表达式搜索,如下所示:(word1 | word2 | word3)

答案 3 :(得分:2)

这个问题是一个好的开始:How do you implement a good profanity filter? - 我同意这个结论,即检测结果总是很差。

我会尝试这些方法:

1)根据你的字典,简单地检测粗俗的单词。

2)提出一些启发式方法,例如“由一个字母组成的连续'单词''(b a d w o r d)并用它们来评估用户的帖子。然后,您可以计算预期的粗俗字数:\sum_i^{number of your heuristics} P_i * N_i,其中P_i是使用启发式i找到的单词实际上是粗俗单词的概率,N_i是一个heuristics i找到的单词。我认为概率方法比简单地说“这篇文章不包含粗俗词”更好。

3)让主持人决定帖子是否真的粗俗。否则,自动替换方法的不完善很可能会让用户发疯。

4)我认为用英语(或土耳其语)字典查找单词是没有用的,以便找到不是真正英语单词的单词,因为这些日子里人们拼错了单词。

答案 4 :(得分:1)

@ f1ames:我正在使用以下代码来制作数组。

    $words = mb_strtolower($words, 'UTF-8');
    $words = $this->removeUniCharCategories($words);
    $words = explode(" ",$words);
    //Remove empty Array !
    $words = array_filter($words);
    foreach ($words as &$value) {
        $newWords[] = $value;
    }
    $words = $newWords;

但我仍然找到最好的溶液