Поскольку каждая строка вашего файла находится в строке массива, функция array_filter
может вас заинтересовать (цитирование) :
array array_filter ( array $input [, callback $callback ] )
Итерация по каждому значению на входе
массив, передавая их обратному вызову
функция.
Если обратный вызов
функция возвращает true, текущий
значение из ввода возвращается в
массив результатов. Ключи массива
сохраняется.
И вы можете использовать strpos
или stripos
, чтобы определить, содержится ли строка в другой.
Например, предположим, у нас есть этот массив:
$arr = array(
'this is a test',
'glop test',
'i like php',
'a badword, glop is',
);
Мы могли бы определить функцию обратного вызова, которая отфильтровывала бы строки, содержащие «glop
»:
function keep_no_glop($line) {
if (strpos($line, 'glop') !== false) {
return false;
}
return true;
}
И используйте эту функцию с array_filter
:
$arr_filtered = array_filter($arr, 'keep_no_glop');
var_dump($arr_filtered);
И мы получили бы такой вывод:
array
0 => string 'this is a test' (length=14)
2 => string 'i like php' (length=10)
т.е. мы удалили все строки, содержащие "badword" и "glop".
Конечно, теперь, когда у вас есть основная идея, ничто не мешает вам использовать более сложную функцию обратного вызова; -)
Редактировать после комментариев: Вот полная часть кода, который должен работать:
Прежде всего, у вас есть список строк:
$arr = array(
'this is a test',
'glop test',
'i like php',
'a badword, glop is',
);
Затем вы загружаете список плохих слов из файла:
И вы обрезаете каждую строку и удаляете пустые строки, чтобы быть уверенными, что в массиве $bad_words
у вас есть только слова, а не пустые элементы, которые могут вызвать проблемы.
$bad_words = array_filter(array_map('trim', file('your_file_with_bad_words.txt')));
var_dump($bad_words);
Массив $bad_words
содержит из моего тестового файла:
array
0 => string 'glop' (length=4)
1 => string 'test' (length=4)
Затем, функция обратного вызова, которая перебирает этот массив плохих слов:
Примечание: использование глобальной переменной не очень приятно :-( Но функция обратного вызова, вызываемая array_filter
, не получает никаких других параметров, и я не хотел загружать файл каждый раз, когда вызывается функция обратного вызова .
function keep_no_glop($line) {
global $bad_words;
foreach ($bad_words as $bad_word) {
if (strpos($line, $bad_word) !== false) {
return false;
}
}
return true;
}
И, как и раньше, вы можете использовать array_filter
для фильтрации строк:
$arr_filtered = array_filter($arr, 'keep_no_glop');
var_dump($arr_filtered);
Что на этот раз даст вам:
array
2 => string 'i like php' (length=10)