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。为什么要使用内爆函数?