1

各行の最初の位置に常に表示されるテキスト ファイルからドメインをフィルタリングしようとしています。

ファイルは次のようになります。

Domains         Users
domain1.com     User1
domain2.com     User2
domain3.com     User3

それが私が試したことです:

preg_match_all('/^[^ ]+/', $file, $matches);

次の結果が生成されます。

array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(6) "Domains"
  }
}

最初の行を取りますが、その後停止します。それはかなり奇妙です。

ここで何か助けていただければ幸いです。

私が持っている他の質問は次のとおりです。より速いのは、preg_match または次の最初のアプローチです。

$lines = preg_split('/\r\n|\r|\n/', $file);

foreach($lines as $line) {
    $parts = explode(' ', $line, 2);
    $domains[] = $parts[0];
}
4

2 に答える 2

2

m修飾子を使用して、複数行モードを許可します。

preg_match_all('/^[^ ]+/m', $file, $matches);
                        ^-- modifiers are here

修飾子のリスト: http://www.regular-expressions.info/modifiers.html

/i は、正規表現の一致で大文字と小文字を区別しません。

/s は「単一行モード」を有効にします。このモードでは、ドットは改行に一致します。

/m は「複数行モード」を有効にします。このモードでは、サブジェクト文字列の改行の前後でキャレットとドルが一致します。

/x は「フリースペース モード」を有効にします。このモードでは、正規表現トークン間の空白は無視され、エスケープされていない # はコメントを開始します。

于 2013-02-08T17:08:17.290 に答える
1

アップデート:

:D 申し訳ありませんが、あなたの質問を最後まで読んでいませんでした。:D..爆発の方が速いと思います...テスト中です....(良い質問です!+1)


更新 2:

私はあなたの爆発の試みと@Frits van Campenの答えの両方をテストしました... '驚いています: preg_match_all() は〜3.5倍高速です

393472 行のテスト ファイルと Ubuntu12.04 php5.3.10 を使用して、次の結果を得ました。

爆発する

real    0m1.409s
user    0m1.284s
 sys    0m0.124s

*preg_match_all*

real    0m0.461s
user    0m0.384s
 sys    0m0.072s

@Frits van Campenの答えがベストだと思います。

于 2013-02-08T17:10:18.370 に答える