Поиск вложенных массивов 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 и т. Д.), Или пользователь может вводить как (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++; } } } } 

У кого-нибудь есть другие идеи, как это сделать?

благодаря

Solutions Collecting From Web of "Поиск вложенных массивов PHP"

  1. Полоса пробела
  2. Искать с одним регулярным выражением, содержащим все ваши ключевые слова, например: (word1 | word2 | word3)

Этот вопрос является хорошим началом: как вы реализуете хороший фильтр ненормативной лексики? – и я согласен с заключением, то есть обнаружение всегда будет иметь плохие результаты.

Я бы попробовал эти подходы:

1) Просто определите слова, которые являются вульгарными в соответствии с вашим словарем.

2) Придумайте несколько эвристик, таких как «непрерывная последовательность слов», состоящая из одной буквы »(« badword »), и используйте их для оценки сообщений пользователей. Затем вы можете вычислить ожидаемое количество вульгарных слов: \sum_i^{number of your heuristics} P_i * N_i , где P_i – вероятность того, что слово, найденное с эвристикой i , действительно является вульгарным, а N_i – это количество слов, найденных эвристиками i , Я думаю, что вероятностный подход лучше, чем просто заявить, что «этот пост (не) содержит пошлое слово».

3) Пусть модератор решит, действительно ли пост пошлый или нет. В противном случае несовершенство вашего метода автоматической замены, скорее всего, заставит ваших пользователей сходить с ума.

4) Я думаю, что бесполезно искать слова в английском (или турецком?) Словаре, чтобы найти слова, которые на самом деле не являются английскими словами, потому что люди слишком часто ошибаются в словах.

Во всяком случае, вы можете mb_ пробельные символы и использовать ( mb_ ) substr_count() но это приводит к получению ложных срабатываний.

Как сказал Йирка Хельмих, вы можете удалить пробелы (и, возможно, другие специальные символы), а затем искать строку, чтобы найти слова из вашего массива.

 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

ура

Редактировать: Итак, Ахмад, я вижу, что вы просто получаете слова, распознающие их «» в начале / конце (в ярлыке). Возможно, вам следует попытаться реализовать оба метода: ваш с одним словом и выше, с поиском подстроки. Это зависит и от того, насколько вы заботитесь о производительности. Может быть, вам стоит попробовать сделать несколько решеток или посмотреть, насколько они эффективны?: D

@ 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; 

Но я все еще нахожу лучшее решение