【问题标题】:Excluding array if it contains string如果包含字符串则排除数组
【发布时间】:2018-04-02 09:48:00
【问题描述】:

不知道我能不能让另一双眼睛看到这个。

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

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

我卡在 A 记录上。不幸的是,当我在文件的每一行中搜索 A 时,这也会导致 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 记录,因为我只搜索 A 记录。

我需要完全忽略 CNAME 和 SOA 数组,只返回仅包含 A 的数组。这是区域文件的摘录

domain.io.      A   8.8.8.8
www             CNAME domain.io

有没有办法做到这一点?

【问题讨论】:

  • 区域文件是制表符分隔文件吗?像这样:example.com。在 192.0.2.1
  • 发布您的初始文件内容

标签: php regex preg-split


【解决方案1】:

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

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

Demo

如果你根本不选择记录而不是过滤它们可能会更好。为此,您可以使用带有单词边界的 preg_match() 而不是 strpos()

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

Demo

【讨论】:

  • 您的第二个版本似乎非常适合我的需要。我什至没有考虑将 $search_a 添加到 preg_match 中。非常感谢!为我节省了大量时间!
【解决方案2】:

如果您要将文本文件放入数组形式,您可以使用preg_grep() 进行过滤。这是使用preg_match() 循环搜索的逻辑替代。

$search_a = 'A';
var_export(preg_grep('/^[^\t]+\t+'.$search_a.'\t/',file("$domain.")));

这从每行的前面开始匹配,一个或多个非制表符,然后是一个或多个制表符,然后是针字符串,然后是制表符,以确保我们进行紧密匹配。

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

...有几种方法可以给这只猫剥皮。


附言您的preg_split() 模式也可以使用一些改进。如果您提供文件中的原始文本,我可以为您制作更好的文本。

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多