2011-09-12 6 views
0

次の3行のテキストがあり、データのみを取得するためには1つの正規表現が必要です。データには任意の文字を含めることができます。単語テストとライン(TEST1 |テスト2 | TEST3 | TEST4)することができ3つの異なるテキスト行に単一のPHP正規表現が必要ですか?

1. test1 data- data 
1. data- data 
data- data 

は、ここで私が何しようとしたものだが、動作していません。

:test1のデータライン2

ため

:データ

$remove_test_name = "(?:test1|test2|test3|test4)"; 

    preg_match("/(?:\d+\.)? $remove_test_name (.*)\-(.*)/",$string,$matches); 
    echo $matches[1] . "-" . $matches[2]; 

私は取得しています出力は、これはライン1(上記に言及)のためであります

ライン3

のための210

:私が望む何

はこれです:

データ:データ

+1

入力形式について詳しく説明してください。「test1」、「test2」などがどこに表示されるのかは不明です。 –

+0

test1またはtest2、またはtest3またはtest3が行番号の後に表示されます。一部の行番号にtest1またはtest2またはtest3またはtest4がありません – bruce

+0

私はあなたのサンプルファイルのテキストが正しく表示されるようにあなたの質問を編集しました...確認してください。 – CanSpice

答えて

0

ここでは’です。PHPと正規表現をテストするためにI ’ mをサンプルします。それは$remove_test_nameではないので、最後のケースTEST5で

<?php 
$sample = array(
    '1. test1 data- data ', 
    '12. data- data', 
    'key- value', 
    '2. test2 key2- value2', 
    '3. test3 data- data ', 
    '4. test4 data- data ', 
    '5. test5 data- data ' 
); 

foreach ($sample as $string) { 
    $remove_test_name = '(?:test1|test2|test3|test4)'; 

    preg_match("/(?:\d+\.)?\s?$remove_test_name?\s?(.*)-(.*)/",$string,$matches); 
    var_dump($matches); 
    echo $matches[1] . "-" . $matches[2]; 
} 
?> 
ここ

’の出力

array 
    0 => string '1. test1 data- data ' (length=20) 
    1 => string 'data' (length=4) 
    2 => string ' data ' (length=6) 

data- data 

array 
    0 => string '12. data- data' (length=14) 
    1 => string 'data' (length=4) 
    2 => string ' data' (length=5) 

data- data 

array 
    0 => string 'key- value' (length=10) 
    1 => string 'key' (length=3) 
    2 => string ' value' (length=6) 

key- value 

array 
    0 => string '2. test2 key2- value2' (length=21) 
    1 => string 'key2' (length=4) 
    2 => string ' value2' (length=7) 

key2- value2 

array 
    0 => string '3. test3 data- data ' (length=20) 
    1 => string 'data' (length=4) 
    2 => string ' data ' (length=6) 

data- data 

array 
    0 => string '4. test4 data- data ' (length=20) 
    1 => string 'data' (length=4) 
    2 => string ' data ' (length=6) 

data- data 

array 
    0 => string '5. test5 data- data ' (length=20) 
    1 => string 'test5 data' (length=10) 
    2 => string ' data ' (length=6) 

test5 data- data 

が表示されます。

+0

これはほとんど仕事を得てくれたハーバートに感謝します。唯一の他の問題は、test1-4が依然として出力に現れることです。何とかキャプチャ1の部分($ matches [1]) – bruce

+0

あなたは行単位で一致するのか、それとも一気に一致していますか? – Herbert

+0

私は行ごとに一致しています。私が試したがまだ動作していない最新の情報はここにあります。 preg_match( "/(?:\ d + \。)?\ s *?$ remove_test_name?\ s *?(。*)/"、$ string、$ matches); – bruce

1

私は入力がその列であると仮定しますダッシュで区切られ、入力に他のダッシュはありません。ですから、/(\s*(.*)\s*-){2}\s*(.*)\s*/の行に沿って何かすべきです。

+0

ありがとうmazzz、うまくいきません、私は唯一の出力を取得します:。私はecho $ matches [1]を使用しました。 " - " $マッチ[2]; – bruce

+0

matches配列のvar_dumpを実行しましたか? – Ben

関連する問題