Чтение и объединение нескольких удаленных файлов PHP

#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?