Отфильтруйте набор плохих слов из массива PHP

У меня есть массив PHP, насчитывающий около 20 000 имен, мне нужно отфильтровать его и удалить любое имя, в котором есть слово job , freelance или project .

Ниже приводится то, что я начал до сих пор, он будет циклически проходить через массив и добавлять очищенный элемент для создания нового чистого массива. Мне нужна помощь, соответствующая «плохим» словам. Пожалуйста, помоги, если можешь

 $data1 = array('Phillyfreelance' , 'PhillyWebJobs', 'web2project', 'cleanname'); // freelance // job // project $cleanArray = array(); foreach ($data1 as $name) { # if a term is matched, we remove it from our array if(preg_match('~\b(freelance|job|project)\b~i',$name)){ echo 'word removed'; }else{ $cleanArray[] = $name; } } 

Прямо сейчас это соответствует слову, поэтому, если «внештатный» – это имя в массиве, оно удаляет этот элемент, но если это что-то вроде ImaFreelaner то это не так, мне нужно удалить все, что имеет в нем соответствующие слова

Регулярное выражение здесь действительно не требуется – скорее всего, будет быстрее использовать несколько вызовов stripos . (Эффективность имеет значение на этом уровне, потому что поиск происходит для каждого из 20 000 имен.)

С array_filter , который сохраняет только элементы в массиве, для которых обратный вызов возвращает true :

 $data1 = array_filter($data1, function($el) { return stripos($el, 'job') === FALSE && stripos($el, 'freelance') === FALSE && stripos($el, 'project') === FALSE; }); 

Вот более расширяемая / поддерживаемая версия, где список плохих слов можно загружать из массива, а не явно указывать в коде:

 $data1 = array_filter($data1, function($el) { $bad_words = array('job', 'freelance', 'project'); $word_okay = true; foreach ( $bad_words as $bad_word ) { if ( stripos($el, $bad_word) !== FALSE ) { $word_okay = false; break; } } return $word_okay; }); 

Я был бы склонен использовать функцию array_filter и изменять регулярное выражение, чтобы оно не соответствовало границам слов

 $data1 = array('Phillyfreelance' , 'PhillyWebJobs', 'web2project', 'cleanname'); $cleanArray = array_filter($data1, function($w) { return !preg_match('~(freelance|project|job)~i', $w); }); 

Использование функции preg_match() и некоторых регулярных выражений должно делать трюк; это то, что я придумал, и это сработало хорошо на моей стороне:

 <?php $data1=array('JoomlaFreelance','PhillyWebJobs','web2project','cleanname'); $cleanArray=array(); $badWords='/(job|freelance|project)/i'; foreach($data1 as $name) { if(!preg_match($badWords,$name)) { $cleanArray[]=$name; } } echo(implode($cleanArray,',')); ?> 

Что вернулось:

 cleanname 

Лично я бы сделал что-то вроде этого:

 $badWords = ['job', 'freelance', 'project']; $names = ['JoomlaFreelance', 'PhillyWebJobs', 'web2project', 'cleanname']; // Escape characters with special meaning in regular expressions. $quotedBadWords = array_map(function($word) { return preg_quote($word, '/'); }, $badWords); // Create the regular expression. $badWordsRegex = implode('|', $quotedBadWords); // Filter out any names that match the bad words. $cleanNames = array_filter($names, function($name) use ($badWordsRegex) { return preg_match('/' . $badWordsRegex . '/i', $name) === FALSE; }); 

Это должно быть то, что вы хотите:

 if (!preg_match('/(freelance|job|project)/i', $name)) { $cleanArray[] = $name; }