2

PHPで使用preg_splitして、次の文字列を分割し、2つのIPアドレスを返そうとしています。

$membersStr = "members { 167.69.27.151:4449 {} 167.69.27.153:4449 {} 167.69.27.154:4449 { session user disabled } 167.67.27.156:4449 }";

私のコードは次のとおりです。

$nodesArray = preg_split("/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/", $membersStr, -1, PREG_SPLIT_NO_EMPTY);

次に、今のところそれを印刷するだけです。

print_r($nodesArray);

ただし、これは空の配列です。オンラインチェッカーから正規表現を再確認すると、IPが返されます。

試してみる:

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $membersStr, $nodesArray);
echo $nodesArray[0];

プリント:

Array

私のブラウザで。

4

2 に答える 2

2

ここでは複雑な正規表現は必要ありません。この Regex を使用して、最初のブラケット セット内の IP を抜き出します。

members \{(.*)\}

最初のグループ (括弧内) を取ります。次にexplode(){}各 IP を取得します。各値を反復処理してトリミングし、空白でないことを確認します。

編集

これを試して:

$membersStr = "members { 167.69.27.151:4449 {} 167.69.27.153:4449 {} }";

$ips = explode("{", $membersStr, 2);
$ips = explode("{}", $ips[1]);

foreach ($ips as $ip){
    $ip = trim($ip);
    if ($ip != "" && $ip != "}")
        echo $ip . "<br/>";
}

ファイルから抽出されたサンプル

 members {
      167.69.97.48:4440 {
         session user disabled
      }
      167.69.97.91:4440 {}
   }

編集

他の答えを使用しますが、次のようにします。

$membersStr = @" members {
      167.69.97.48:4440 {
         session user disabled
      }
      167.69.97.91:4440 {}
   }";

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $membersStr, $nodesArray);

foreach ($nodesArray[0] as $ip)
    echo $ip . "<br/>";
于 2011-02-21T19:34:53.707 に答える
0

分割に既存の正規表現を使用する場合、一致した部分は確かに結果リストの一部にはなりません。代わりに、空のスペースを取得し、その間にあるものを埋めます。

したがって、実際に必要なパーツを一致させて抽出すると、より簡単になります。

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $str, $matches);
$list = $matches[0];
于 2011-02-21T19:42:33.533 に答える