1

テキストファイルには、次の文字列があります。

 ID  |      LABEL       | A |   B  | C
--------------------------------------
9999 | Oxygen Isotopes  |   | 0.15 | 1 
8733 | Enriched Uranium |   | 1    | 1 

ID正規表現を使用してフィールドとLABEL各行を抽出したいと思います。

どうすればそれを達成できますか?

4

7 に答える 7

2

なぜ正規表現を主張したのかわかりません。

列が|で区切られているように見えるため シンボル、PHP関数explodeを使用する方が簡単な解決策のようです。

行をループして、一般的な配列の添字表記を使用して各列を参照できます。たとえば$line[0]$line[1]IDとLABELをそれぞれ使用できます。

于 2012-11-10T22:14:49.160 に答える
1

ここで正規表現が最善の解決策であるとは思えません。

これを試して、テキストファイルを行の配列に分割します(これは、txtファイルを作成したマシンのOSに応じて、機能する場合と機能しない場合があります)

$lines = explode($text, "\n");
$final_lines = array();

foreach ($lines as $line) {
    $parts = explode($line, " | ");
    $final_lines[] = $parts;
}

これで、次のように、行番号、次に列を介してすべてのデータにアクセスできます。

$final_lines[2][0]

8733が含まれます。

于 2012-11-10T22:23:15.687 に答える
1

すべての行で使用できますpreg_split

$array = preg_split(`/\s*\|\s*/`, $inputLine, 2);

次に、djdy's answer のように、ID は に$array[0]、ラベルは になり$array[1]ます。

于 2012-11-10T22:15:15.097 に答える
1

正規表現は必要ありません:

<?php
$file = file('file.txt');

$ret = array();
foreach($file as $k=>$line){
    if($k<2){continue;}

    list($ret['ID'][],
         $ret['LABEL'][],
         $ret['A'][],
         $ret['B'][],
         $ret['C'][]) = explode('|',$line);
}

print_r($ret);

//Label: Oxygen Isotopes ID:9999 
echo 'Label: '.$ret['LABEL'][0].' ID:'.$ret['ID'][0];

/*
Array
(
    [C] => Array
        (
            [0] =>  1 

            [1] =>  1 
        )

    [B] => Array
        (
            [0] =>  0.15 
            [1] =>  1    
        )

    [A] => Array
        (
            [0] =>    
            [1] =>    
        )

    [LABEL] => Array
        (
            [0] =>  Oxygen Isotopes  
            [1] =>  Enriched Uranium 
        )

    [ID] => Array
        (
            [0] => 9999 
            [1] => 8733 
        )

)
*/
?>
于 2012-11-10T22:20:43.073 に答える
0

ここで正規表現を使用するのは最善の方法ではありませんが、次のようになります。

preg_match_all("/(\d{4}.?)\|(.*?)\|/s", $data, $matchs)

の2番目と3番目のインデックスは$matches必要なデータを運びます

于 2012-11-10T22:23:55.103 に答える
0

ここでは、正規表現は最善の方法ではない可能性があります。各行を文字列として読み取り、String.explode("|", input) を使用して文字列の配列を作成します。インデックス 0 は ID、インデックス 1 はラベルです。必要に応じて、A、B、C についても同様です。これは、正規表現を使用するよりも堅牢なソリューションです。

ID を取得する正規表現は次のようになります。

\d{4}  |

ラベル フィールドに対して同様のことを行うことができますが、これもバグです。これは、explode を使用するほど堅牢ではありません。

于 2012-11-10T22:16:00.597 に答える
0

試す

$str = file_get_contents($filename);
preg_match_all('/^\s*(\d*)\s*\|\s*(.*?)\s*\|/m', $str, $matches);
// $matches[1] will have ids
// $matches[2] will have labels 
于 2012-11-10T22:20:22.430 に答える