2011-06-19 173 views
2

我在PHPPHP嵌套阵列搜索

是新我有这样

$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等) ,或者用户可能输入像(badword 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++; 
      } 
     } 
    } 
} 

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

感谢

+2

只是一个想法 - 改变你的关键字!这也是一个孩子网站(如果他们是编码员),你不能使用这个词。 – fingerman

+0

得爱阵列值:D – MeLight

+0

同意(第一张海报),你是12还是什么,发现这些词很酷?改变它们。 – PaulM

回答

2

无论如何,你可以剥离空白字符和使用(mb_substr_count(),但它会导致越来越误报。

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

干杯

编辑:所以艾哈迈德我看到你只是在开始/结束处(以快捷方式)通过“”识别他们。也许你应该尝试实现这两种方法,你的单词和上面的子字符串搜索。这也取决于你对性能的关心程度。也许你应该尝试做一些reserches或某事,看看它是如何有效:d

+0

我正在使用下面的代码来使它成为数组。 \t \t $ words = mb_strtolower($ words,'UTF-8'); \t \t $ words = $ this-> removeUniCharCategories($ words); \t \t $ words = explode(“”,$ words); \t \t //删除empty Array! \t \t $ words = array_filter($ words); \t \t foreach($ words as&$ value){ \t \t \t $ newWords [] = $ value; \t \t} \t \t $ words = $ newWords; 但我仍然找到最好的溶剂 – Ahmad

2
  1. 地带空间
  2. 搜索包含所有关键字,ONE的正则表达式是这样的:(字词|单词2 | WORD3)
+0

广告2:这当然是一种如何做到这一点的方式,但如果禁用词语的数量很高,Aho-Corasick算法对于任务来说更好。 –

+0

ad Aho-Corasick:你说的对,这是最好的算法。但是1.在大多数情况下,默认的常规匹配应该很好,2.理论上,正则表达式匹配器可以使用内部的Aho-Corasick(但是据我所知,默认的匹配不会;但例如“fgrep”使用Aho -Corasick) –

2

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

我会尝试这些方法:

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

2)拿出一些启发式的方法,比如“由单个字母组成的”单词连续序列“(b和d or d),并用它们来评估用户的帖子。然后,您可以计算预期的低俗单词数量:\sum_i^{number of your heuristics} P_i * N_i,其中P_i是单词与启发式i一起发现的概率实际上是低俗的概率,N_i是由启发式i发现的单词数量。我认为概率方法比简单地陈述“这篇文章确实(不)包含粗俗的词语”更好。

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

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; 

但我仍然找到最好的sollution