2011-12-22 14 views
3
除く文字列、

可能性の重複:
Split string by delimiter, but not if it is escaped私は、文字列がパイプ|文字で区切られているのIBM Informixデータベースを形成し、生成しているスプリット一部の文字

といくつかのデータの誤差がありますこれは、バックスラッシュ+パイプがデータ内にあることを意味します。私はバックスラッシュ+パイプ\|またはパイプで他の兆候からではなく、パイプの記号からのみこれらの文字列を分割したいと思います。

これは私のコードですが、それは、パイプ文字でのみ動作します。誰も私がこれを行う助けることができる

foreach(glob("ssbstat.unl") as $file) 
{ 
    $c=0;  
    if(($load = fopen($file, "r")) !== false) 
    { 
     $line = fgets($load);   
     $count= count(explode('|', $line)); 
     echo $fm= str_repeat('%[^|]|', $count)."%s\n";  

     do 
     { 
      echo $line; 
      print_r($line); 
      if($c++>10) break; 
     } while ($line = fscanf($load, $fm)); 
    } 
} 

+1

PHP4?アップグレードするための時間を... –

+1

どのような "他の文字"を除外しなければならなかったのですか?パイプで他の記号をどういう意味ですか?無視したいだけですか? –

答えて

1

あなたはpreg_splitでこれを行うことができますようMaerlynが、これがまた可能である、と述べました。この作品[^\\\\]は、バックスラッシュとのパイプがあなたが[]内で無視したい他の文字を追加することができます。4つのバックスラッシュが適切なエスケープのために必要とされる(無視されるべきであることを指定します。

print_r(preg_split('/(?<![\\\\])\|/', 'This\|is a|test|string')); 
+0

これは動作しません! 'This is | is a test | string' 'のような文字列は、これを返します: 'Array([0] =>" This is | "[1] =>" tes "[2] =>" string " ) 'バックスラッシュではない' | 'の前の文字はsplit関数の一部でもあるので、それは離れていると言うからです。そのため、preg_replaceを前もって使用する必要があります(Answerdのように) – noob

+0

良いキャッチです。私は本当に否定的なlookbehindを使用していたはずです。 'preg_replace'は必要ありません。回答が更新されました。 –

+0

+1非常に良い解決策! – noob

-1

このようにそれを実行してくださいbackslah + pipesign

+0

どのようなプレースホルダをお勧めしますか?データに表示されない可能性のあるものでなければならないか、最後の置換えによってデータが破損する可能性があります。 –

+0

"{[%my_great_placeholder%]}"のようなもの –

+0

そこに約100000ライン。それはこれのために地獄を取っている。私は短い方法が欲しい。この正規表現を開発できますか? – lankitha

3

でプレースホルダをバック置き換え、その後、その後、pipesignで爆発、プレースホルダとbackslah + pipesignを交換してください:

<?php 
$line = preg_replace("/([^\\\])\|/", "$1 |", "Hi \|error\| man|ok man|perfect man"); 
print_r(preg_split('/[^\\\]\|/', $line)); 

ウィル出力:

Array ([0] => "Hi \|error\| man" [1] => "ok man" [2] => "perfect man") 

Testet!

編集:

<?php 
$line = "Hi \|error\| man|ok man|perfect man"; 
print_r(preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $line));