2017-10-21 67 views
3

想知道如果我能得到另一雙眼睛在這個。排除數組,如果它包含字符串

用例;從區域文件中抓取DNS記錄以運行shell_exec將其導入另一個平臺。

我想從區域文件,記錄,CNAME,TXT,MX等中獲取所有類型的DNS記錄。目前爲止,我已經成功完成了CNAME,TXT和MX記錄。

我被困在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記錄,因爲我只是尋找一個記錄。

我需要完全忽略CNAME和SOA陣列和只返回包含剛剛A.這裏有一個從區域文件

domain.io.  A 8.8.8.8 
www    CNAME domain.io 

是否有這樣做的方式提取的嗎?

+1

區文件是製表符分隔的文件嗎?像這樣:example.com。 IN A 192.0.2。1 – bluehipy

+1

發佈您的初始文件內容 – RomanPerekhrest

回答

1

您可以檢查結果數組的第二個元素是否爲A,並且僅當它是時,繼續您的邏輯。否則,跳過該行:

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

Demo

它很可能會更好但如果你沒有選擇的紀錄所有,而不是過濾它們。您可以使用preg_match()用一個單詞邊界,而不是strpos()此:

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

Demo

+0

您的第二個版本似乎是我需要的完美。我甚至沒有考慮將$ search_a添加到preg_match中。非常感謝你!爲我節省了大量的時間! – Dan

0

如果你打算把你的文本文件導入陣列形式,你可以用preg_grep()過濾。這是使用preg_match()在循環中搜索的邏輯替代。

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

這從各行的前面,一個或多個非製表符,那麼一個或多個製表符,然後將針串,然後一個製表符,以確保我們正在緊張的比賽相匹配。

preg_quote()可能是必要的,具體取決於在$search中將使用哪些字符。

...有幾種方法來剝皮這隻貓。


p.s.你的preg_split()模式也可以使用一些改進。如果你從文件中提供原始文本,我可以爲你製作一個更好的文本。

相關問題