0

RIPE 割り当てデータベース ( ftp://ftp.ripe.net/ripe/stats/membership/alloclist.txt ) をデータベースに解析する必要があるプロジェクトに取り組んでいます。

すべてのメンバーを取得する必要があるため、xx の間のすべてを一致させる必要があります。と \n\nxx. ここで、x は任意の小文字です。

ファイルの数行を次に示します。

ad.andorpac
    Servei de Telecomunicacions d'Andorra 

    19960627    194.158.64.0/19 ALLOCATED PA
    20050104    85.94.160.0/19  ALLOCATED PA
    20061117    91.187.64.0/19  ALLOCATED PA
    20091124    109.111.96.0/19 ALLOCATED PA
    20120925    185.4.52.0/22   ALLOCATED PA
    20110722    2a02:8060::/31

ae.absl-me
    Asia Broadcast Satellite Ltd (Middle East) 

    20110321    31.47.88.0/21   ALLOCATED PA

ae.adac
    Abu Dhabi Airports Company PJSC 

    20120402    37.218.224.0/21 ALLOCATED PA

私は正規表現の専門家ではありません。どなたかこれらの表現を提供していただけますか?

4

2 に答える 2

1

これを解析するために非常に精巧な正規表現は必要ありません。区切り文字で分割してから、各エントリを解析できます。

// $string contains the text
$entries = explode("\n\n", $string);
for($i=0; $i < sizeof($entries); $i+=2){
    parse_header($entries[$i]));
    parse_entries($entries[$i+1]);
}

「ヘッダー」は「ad.andorpac\nServei de Telecomunicacions(...)」のようなものなので、解析は非常に簡単です。エントリを解析するには、"\n" で分割し、それぞれを正規表現で処理して、フィールドをスペースで分割します。

function parse_entry($entries){
    $strings = explode("\n", $entries);
    foreach($strings as $s){
        preg_match("/(?P<number>\d+)\s+(?P<addr>[\d\.\/]+)\s+(?P<str1>\w+)\s+(?P<str2>\w+)/",   
            $s, $result);
    // You can then access then the results
    echo $results["addr"]; // prints "185.4.52.0/22"
    }       
}

これは完全に機能する回答ではありませんが、問題の大部分に対処する必要があります。trim関数を使用して、一致した文字列の先頭/末尾のスペースを削除する必要がある場合もあります。

編集

正規表現の簡単な説明:

(?P<number>\d+) => matches one or more digits, and stores them in the "number" index
\s+ => matches one or more spaces and ignores them
(?P<addr>[\d\.\/]+) => matches the network address (one or more digits, dots or slashes)
\s+ => same
(?P<str1>\w+) => matches the first string ("ALLOCATED")
\s+ =>
(?P<str2>\w+) => matches the 2nd string
于 2013-05-17T21:24:36.080 に答える