#php
#php
Вопрос:
Я использую этот код для чтения нескольких удаленных файлов:
$filters = [ "https://example.com/file.txt", "https://example.com/file1.txt", "https://example.com/file3.txt" ]
function parseFilterLists( $filters )
{
foreach( $filters as $filter ){
$file = file_get_contents( $filter );
$parsed = preg_replace( '/!.*/', '', $file );
$parsed = preg_replace( '/||([wd] (?:.[w] ) )(?:[^$=~].*)/', '*://*.$1/*', $parsed );
}
$output = array_filter( explode( "n", $parsed ), function($url){
return preg_match('/^*://*.[wd-] .[w] /*$/', $url);
});
return array_values(array_unique($output));
}
Я заметил, что выводимое содержимое усекается, как будто обрабатывается только один файл, но мне нужно объединить три файла, чтобы манипулировать ими. Как я могу этого добиться?
Комментарии:
1. Вы спрашиваете, как объединить строки?
2. Нам нужно увидеть содержимое файлов.
3. Область действия $parsed ограничена циклом foreach, вы получаете только последний файл в списке $filters.
4. @RobRuchte хорошо, итак, как я могу решить это, повторяя код вслух?
Ответ №1:
Область $parsed
действия ограничена циклом foreach, поэтому $output
содержит только результаты последней итерации цикла. Вы должны определить $output
перед циклом и добавлять к нему результаты каждой итерации.
<?php
$filters = ["https://example.com/file.txt", "https://example.com/file1.txt", "https://example.com/file3.txt"];
function parseFilterLists($filters)
{
// Define a buffer for the output
$output = [];
foreach ($filters as $filter)
{
$file = file_get_contents($filter);
$parsed = preg_replace('/!.*/', '', $file);
$parsed = preg_replace('/||([wd] (?:.[w] ) )(?:[^$=~].*)/', '*://*.$1/*', $parsed);
// Get the output for the file we're working on in this iteration
$currOutput = array_filter(explode("n", $parsed), function ($url) {
return preg_match('/^*://*.[wd-] .[w] /*$/', $url);
});
// Append the output from the current file to the output buffer
$output = array_merge($output, $currOutput);
}
// Return the unique results
return array_unique($output);
}
Комментарии:
1. Спасибо за помощь и разъяснение о
$parsed
var, я полагаю, что я могу применить это также к методу класса, определив$output
переменную поверх файла правильно?2. Пожалуйста, да, вы можете это сделать, вам просто нужно будет ссылаться на это как на $this-> output внутри функции.
Ответ №2:
Я думаю, это будет работать так, как вы хотите
$filters = [
"https://example.com/file.txt", "https://example.com/file1.txt", "https://example.com/file3.txt"
];
function parseFilterLists( $filters )
{
$files = [];
foreach( $filters as $filter ){
$files[] = file_get_contents( $filter );
}
$parsed = preg_replace( '/!.*/', '', implode("n", $files));
$parsed = preg_replace( '/||([wd] (?:.[w] ) )(?:[^$=~].*)/', '*://*.$1/*', $parsed);
$output = array_filter( explode( "n", $parsed ), function($url){
return preg_match('/^*://*.[wd-] .[w] /*$/', $url);
});
return array_values(array_unique($output));
}
Комментарии:
1. Почему вы использовали функцию implode?