1

名前と電子メールを 1 つのデータ ファイルから抽出する必要があります。ファイルには 500 行以上が含まれており、この 2 つの情報からほぼすべてのデータを抽出したいと考えています。preg_match_all を使用したいのですが、機能が動作しません...

  $chaine =
"  -----------------
11/21/12 16:06:54 tcp static-qvn-qvt-127041
MAIL toto1@web.com
NAME tata1
 -----------------
11/21/12 16:06:54 tcp static-qvn-qvt-127041
MAIL toto2@web.com
NAME tata2
 *  -----------------
11/21/12 16:06:54 tcp static-qvn-qvt-127041
MAIL toto3@web.com
NAME tata3
";

//$chaine =" #76:50#89:1#86:50#49:1#84:22";
$motif="/MAIL([a-z]{2,4}+)NAME([a-z]{2,4}+)/";
preg_match_all($motif,$chaine,$out);
$nb=count($out[0]);
for($i=0;$i<$nb;$i++)
{
    echo $out[0][$i].'<br/>';
}
4

2 に答える 2

1

"s" 修飾子により、複数行のサポートが追加されました。

正規表現は次のようになります。

$motif="/MAIL\s*([a-z]{2,4}).*?NAME\s*([a-z]{2,4})/s";
于 2012-11-21T17:16:27.437 に答える
1

あなたがやっていることに対して、正規表現は少しやり過ぎかもしれないと思います。

単純に 1 行ずつ読み、スペースを区切り文字として展開 (ドキュメントはこちら) してから、最初の項目が「MAIL」か「NAME」かを確認してから、2 番目の項目を使用し、それ以外の場合は破棄しないでください。ライン?

これを行うコード例を次に示します。

foreach(preg_split("/((\r?\n)|(\r\n?))/", $chaine) as $line)
{
    $segments = explode(' ', $line);
    if($segments[0] === "MAIL")
        echo "Found mail " . $segments[1] . "\n";
    elseif($segments[0] === "NAME")
        echo "Found name " . $segments[1] . "\n";
} 
于 2012-11-21T17:16:40.153 に答える