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 回答