0

次の文字列があります。

$teststring = " 

                                         Flow Link          Back   Mdix

ポート タイプ デュプレックス 速度 Neg ctrl 状態 圧力モード


fa1 100M-Copper -- -- -- -- ダウン -- --
fa2 100M-Copper -- -- -- -- ダウン -- --
fa3 100M-Copper -- -- -- -- ダウン -- - -
fa4 100M-Copper -- -- -- -- ダウン -- --
fa5 100M-Copper -- -- -- -- ダウン -- --
fa6 100M-Copper -- -- -- -- ダウン -- --
fa7 100M-Copper -- -- -- -- 下 -- --
fa8 100M-Copper -- -- -- -- 下 -- --
gi1 1G-Combo-C -- -- -- --下 - -
gi2 1G-Combo-C フル 100 有効 オフ アップ 無効 オフ

                                      Flow    Link        

Ch Type Duplex Speed Neg control State


Po1 -- -- -- -- -- 存在しない Po2 -- -- -- -- -- 存在しない Po3 -- -- -- -- -- 存在しない Po4 -- -- -- -- --存在しない Po5 -- -- -- -- -- 存在しない Po6 -- -- -- -- -- 存在しない Po7 -- -- -- -- -- 存在しない Po8 -- -- -- -- - 現在ではない " ;

各フィールドを解析しようとしています。これまでのコードは次のとおりです。

$teststring = explode("<BR>", $teststring);     
$vlandetailsArray = array();
foreach ($teststring as $vlandetails) 
{            
  //              port     space    type     space   duplex          speed       space  neg         
  $pattern = '/([a-z0-9]*)(\s*)([a-z0-9\-]*)(\s*)[(Full)|(\-{2})](\s*)[(\-)+|(100)](\s*)[(--)*|(Enabled)](\s*)[(--)*|(Off)]/i';

  if (preg_match($pattern, $vlandetails, $matches)) 
  {  
       echo 'match 0: '.$matches[0].'<br>';  //0 index always returns all matches
      }

これは以下を返します。

match 0: -------- ---- 
match 0: fa1 100M-Copper -- -- 
match 0: fa2 100M-Copper -- -- 
match 0: fa3 100M-Copper -- -- 
match 0: fa4 100M-Copper -- -- 
match 0: fa5 100M-Copper -- -- 
match 0: fa6 100M-Copper -- -- 
match 0: fa7 100M-Copper -- -- 
match 0: fa8 100M-Copper -- -- 
match 0: gi1 1G-Combo-C -- -- 
match 0: -------- ----
match 0: Po1 -- -- -- 
match 0: Po2 -- -- -- 
match 0: Po3 -- -- --
match 0: Po4 -- -- -- 
match 0: Po5 -- -- -- 
match 0: Po6 -- -- --
match 0: Po7 -- -- -- 
match 0: Po8 -- -- --

次のような行を取得しない理由がわかりません。

gi2      1G-Combo-C   Full    100   Enabled  Off  Up          Disabled Off

私が見逃している/間違っていることを教えてもらえますか?
ご参考までに。私はまだ正規表現をいじっているので、パターン (-{2}) を使用したり、-+ などを使用したりすることがあります。

編集1

テスト文字列を変更しました。以前は、CR LF を に置き換える次のコードがありました

        $this->_data  = str_replace(chr(10),"<BR>",$this->_data ,$count);//strip New line
        $this->_data  = str_replace(chr(13),'',$this->_data ,$count);//strip carriage return    

申し訳ありませんが、これらのコード行を見落としていました。ページに「テスト」が多すぎます。現在表示されているテスト文字列は「生」のものです。次のようにすべてをファイルに保存します。

 $fp = fopen('/var/www/lsm/application/logs/showinterfacesstatus.txt', 'w');
 fwrite($fp, $this->_data);
 fclose($fp);   

ここで、$this->_data には生データが含まれます。私はこのファイルを開いてすべてをコピーしました...それから私のテスト文字列変数に貼り付けました。
そうは言っても、テキスト エディターでファイルを分析したところ、元の文字列と変更された文字列の唯一の違いは、すべての CRLF が削除されていることです。しかし、それが役立つ場合に備えて、このロジックを削除しました. また、テキスト エディター内の変更されていないデータのスクリーンショットも含めました。ありがとう。 オリジナルデータ

4

2 に答える 2

1

これを試してください:

#[a-z]{2}\d\s[^\s]+ [a-z\-]+[^\s]+ ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+)#si

大文字と小文字を区別しないモードを有効にする必要があります。

もう 1 つは、... インターフェース名を取得するには?

#[a-z]{2}\d ([^\s]+) [a-z\-]+[^\s]+ ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+)#si

完全なコード例:

<?php

$teststring = " 
Flow Link Back Mdix 
Port Type Duplex Speed Neg ctrl State Pressure Mode 
-------- ------------ ------ ----- -------- ---- ----------- -------- ------- 
fa1 100M-Copper -- -- -- -- Down -- -- 
fa2 100M-Copper -- -- -- -- Down -- -- 
fa3 100M-Copper -- -- -- -- Down -- -- 
fa4 100M-Copper -- -- -- -- Down -- -- 
fa5 100M-Copper -- -- -- -- Down -- -- 
fa6 100M-Copper -- -- -- -- Down -- -- 
fa7 100M-Copper -- -- -- -- Down -- -- 
fa8 100M-Copper -- -- -- -- Down -- -- 
gi1 1G-Combo-C -- -- -- -- Down -- -- 
gi2 1G-Combo-C Full 100 Enabled Off Up Disabled Off 

Flow Link 
Ch Type Duplex Speed Neg control State 
-------- ------- ------ ----- -------- ------- ----------- 
Po1 -- -- -- -- -- Not Present 
Po2 -- -- -- -- -- Not Present 
Po3 -- -- -- -- -- Not Present 
Po4 -- -- -- -- -- Not Present 
Po5 -- -- -- -- -- Not Present 
Po6 -- -- -- -- -- Not Present 
Po7 -- -- -- -- -- Not Present 
Po8 -- -- -- -- -- Not Present";

$pattern = '#[a-z]{2}\d ([^\s]+) [a-z\-]+[^\s]+ ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+)#si';

preg_match_all($pattern, $teststring, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    echo '<pre>';
    var_dump($match);
    echo '</pre>';
}

/* EOF */
于 2012-12-05T21:46:39.040 に答える
0

動作する正規表現パターンは次のとおりです。

$ pattern ='/([az] {2} \ d)(\ s *)([0-9a-z-] )(\ s)([az-] )(\ s)([0-9- ] )(\ s)([az-] )(\ s)([az-] )(\ s)([az-] )(\ s)([az-] )(\ s)([az- ]*)/私';

于 2012-12-06T15:08:14.017 に答える