Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 排除包含字符串的数组_Php_Regex_Preg Split - Fatal编程技术网

Php 排除包含字符串的数组

Php 排除包含字符串的数组,php,regex,preg-split,Php,Regex,Preg Split,不知道我能不能在这上面再找一双眼睛 用例;从区域文件中获取DNS记录,以便运行shell_exec将其导入另一个平台 我试图从一个区域文件、一个记录、CNAME、TXT、MX等中获取所有类型的DNS记录。到目前为止,我做得很好,我已经成功地做了CNAME、TXT和MX记录 我被卡在唱片上了。不幸的是,在我搜索文件的每一行时,这导致了CNAME和SOA也被返回。以下是我所拥有的: // Looking for: $search_a = 'A'; // Read from file $lines

不知道我能不能在这上面再找一双眼睛

用例;从区域文件中获取DNS记录,以便运行shell_exec将其导入另一个平台

我试图从一个区域文件、一个记录、CNAME、TXT、MX等中获取所有类型的DNS记录。到目前为止,我做得很好,我已经成功地做了CNAME、TXT和MX记录

我被卡在唱片上了。不幸的是,在我搜索文件的每一行时,这导致了CNAME和SOA也被返回。以下是我所拥有的:

// Looking for:
$search_a = 'A';

// Read from file
$lines = file("$domain.");

// Check if the line contains A
foreach($lines as $a) {
    if(strpos($a, $search_a) !== false) {
    $a_array = "$a";
    $a_record_output = preg_split('/(.'.$domain.'.|\s)/', $a_array, -1, PREG_SPLIT_NO_EMPTY);
    print_r($a_record_output);
    }
}
这将返回:

Array
(
    [0] => domain.io.
    [1] => SOA
    [2] => ns1.domain.io.
    [3] => stuff.
    [4] => (64719
    [5] => 14400
    [6] => 7200
    [7] => 2419200
    [8] => 3600)
)
Array
(
    [0] => domain.io.
    [1] => A
    [2] => 8.8.8.8
)
Array
(
    [0] => autodiscover
    [1] => CNAME
    [2] => autodiscover.outlook.com.
)
显然,它正在工作,但是,我需要排除SOA和CNAME记录,因为我只是在搜索一个记录

我需要完全忽略CNAME和SOA数组,只返回只包含A的数组

domain.io.      A   8.8.8.8
www             CNAME domain.io

有什么方法可以做到这一点吗?

您可以检查结果数组的第二个元素是否为
a
,如果是,则继续您的逻辑。否则,请跳过该行:

if ($a_record_output[1] !== "A") continue;

不过,如果你根本不选择记录,而不是过滤它们,可能会更好。您可以与单词边界一起使用,而不是为此:

if (preg_match("/\b".$search_a."\b/i", $a)) {

如果要将文本文件放入数组形式,只需使用
preg_grep()
进行过滤即可。这是对使用
preg\u match()
在循环中搜索的逻辑替代

$search_a = 'A';
var_export(preg_grep('/^[^\t]+\t+'.$search_a.'\t/',file("$domain.")));
这将从每行的前面匹配,一个或多个非制表符,然后是一个或多个制表符,然后是针字符串,然后是制表符,以确保我们正在进行紧密匹配

可能需要使用
preg_quote()
,具体取决于
$search
中使用的字符

…给这只猫剥皮有几种方法



p、 您的
preg_split()
模式也需要一些改进。如果您提供文件中的原始文本,我可以为您制作一个更好的。

区域文件是否为选项卡分隔文件?比如:example.com。在192.0.2.1发布您的初始文件内容时,您的第二个版本似乎非常适合我的需要。我甚至没有想过在preg_比赛中增加$search_a。非常感谢你!节省了我很多时间!