如何使用preg_match过滤第一个匹配项

时间:2013-02-08 17:05:41

标签: php preg-match preg-match-all

我正在尝试从文本文件中过滤域,这些域始终位于每行的第一个位置。

文件看起来像:

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];
}

2 个答案:

答案 0 :(得分:2)

使用m修饰符允许多行模式:

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

修饰符列表:http://www.regular-expressions.info/modifiers.html

  

/ i使正则表达式匹配不区分大小写。

     

/ s启用“单行模式”。在此模式下,点匹配换行符。

     

/ m启用“多线模式”。在这种模式下,插入符号和美元符合前后   主题字符串中的换行符。

     

/ x启用“自由间隔模式”。在这种模式下,正则表达式令牌之间的空格被忽略,未转义的#开始注释。

答案 1 :(得分: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的答案是最好的。