你好,我有一个愚蠢的问题。我想解析Firewall configuration file
。我准备了一个脚本,它应该显示文件中第一个条目的所有端口:
$fileRule = file_get_contents("configurationfile.w");
$rules = explode(":rule (",$fileRule);
$rules = array_slice($rules,1,-1);
foreach($rules as $rule){
$ports = array();
if (strpos($rule,'RULE')){
$serv = getServices($rule);
$ports = getPorts($serv);
var_dump($ports);
exit;break;
}
}
function getServices($ rule)返回一个数组(用var_dump
检查)并且变量$serv
设置正确。但是函数getPorts($ports
的某种结果是空的。
function getPorts($serv){
$fileObjects = file_get_contents("objects.C");
$portss = array();
$ref = array();
foreach ($serv as $servPoint){
$portAll = getBetween($fileObjects,": ($servPoint",":type (");
if (strpos($portAll,': (ReferenceObject')){
$portExploded = explode(": (ReferenceObject",$portAll);
$portExploded = array_slice($portExploded,1);
foreach($portExploded as $refPort){
$refName = getBetween($refPort,":Name (",")");
array_push($ref, $refName);
}
getPorts($ref);
}
else{
$portAll = getBetween($fileObjects,": ($servPoint",":updated_by_sd");
$port = getBetween($portAll,":port (",")");
$type = getBetween($portAll,":type (",")");
array_push($portss,array($port,$type));
}
}
return $portss;
}
我检查了变量$portss
(在getPorts
中返回)和echoed
它和变量包含适当的值集,但是在离开函数后它没有被传递。 / p>
任何人都可以给我一个提示我缺少什么?
修改
var_dump($portss)
内getPorts()
的结果
array(4) {
[0]=>
array(2) {
[0]=>
string(3) "666"
[1]=>
string(3) "RDP"
}
[1]=>
array(2) {
[0]=>
string(3) "667"
[1]=>
string(3) "RDP"
}
[2]=>
array(2) {
[0]=>
string(3) "668"
[1]=>
string(3) "RDP"
}
[3]=>
array(2) {
[0]=>
string(3) "669"
[1]=>
string(3) "RDP"
}
}
答案 0 :(得分:1)
在函数getPorts
的最后一次执行中不可能(记住它是一个递归函数),你拥有所有数据并且不会将它返回到main函数。
我认为问题在于,在函数的最后一次执行中,您返回变量$portss
,但它是空的,因为您在函数的开头设置它。
在递归函数中,你需要恢复从里面函数返回的数据,所以你可以做一些事情(我不能给你一个直接的答案,因为你不知道你正在解析的文件)
1.-将此getPorts($ref);
更改为此$portss = getPorts($ref);
,这样就可以从函数的其他执行中恢复数据。
2.-将返回的变量$portss
作为参数传递给函数,以便在最后一次执行时访问它。