Php 读取并连接多个远程文件

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

我正在使用此代码读取多个远程文件:

$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( '/\|\|([\w\d]+(?:\.[\w]+)+)(?:[\^\$=~].*)/', '*://*.$1/*', $parsed ); 
    }
    $output = array_filter( explode( "\n", $parsed ), function($url){
      return preg_match('/^\*:\/\/\*\.[\w\d-]+\.[\w]+\/\*$/', $url);
    });
    return array_values(array_unique($output));
  }

我注意到输出内容会被截断,就像只处理一个文件一样,但我需要的是连接三个文件来操作它们。如何实现这一点?

解析的
$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('/\|\|([\w\d]+(?:\.[\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('/^\*:\/\/\*\.[\w\d-]+\.[\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);
}

我想这会像你想的那样工作

$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( '/\|\|([\w\d]+(?:\.[\w]+)+)(?:[\^\$=~].*)/', '*://*.$1/*', $parsed); 
    $output = array_filter( explode( "\n", $parsed ), function($url){
      return preg_match('/^\*:\/\/\*\.[\w\d-]+\.[\w]+\/\*$/', $url);
    });
    return array_values(array_unique($output));
  }

您是在问如何连接字符串吗?我们需要查看文件的内容。$parsed的作用域仅限于foreach循环,您只能得到$filters列表中的最后一个文件。@RobRuchte好的,那么我如何在不重复代码的情况下解决这个问题呢?感谢您对
$parsed
变量的帮助和说明,我想我也可以通过在文件顶部定义
$output
变量将其应用于类方法,对吗?不客气,是的,你可以这样做,你只需要在函数内部将其称为$this->output。为什么要使用内爆函数?