2013-02-08 101 views
1

我试图从始终出现在每行的第一个位置的文本文件中筛选域。如何使用preg_match过滤第一个匹配项

文件看起来像:

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

你真的需要这里的正则表达式吗?你可以用'file()'将行加载到一个数组中,然后使用substr/strpos或爆炸/修剪来获得你的域名。 – 2013-02-08 17:10:25

+0

@One Trick Pony这是一个好主意+1 – Aley 2013-02-08 17:37:16

回答

2

使用m改性剂,以允许多行模式:

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

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

/I使正则表达式匹配大小写不敏感的。

/s启用“单线模式”。在这种模式下,点符合换行符。

/m启用“多线模式”。在这种模式下,脱字符和美元匹配 换行符前后的主题字符串。

/x启用“自由间隔模式”。在这种模式下,正则表达式标记之间的空白被忽略,并且一个未转义的#开始注释。

+0

m修饰符做到了。谢谢:) – Aley 2013-02-08 17:51:10

1

更新:

:d对不起,我没有读到结尾你的问题。 :d ..我想说的是爆炸更快......我测试....


更新2(好问题+1!):

我测试过测试了,你的爆炸企图和@Frits面包车坎彭的答案,...“M惊讶: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面包车坎彭的回答是最好的。

+0

谢谢你的测试+1 – Aley 2013-02-08 17:39:49

+1

如你所见,我真的对此感到惊讶。有时候PHP会给我一个黑盒子:) ..我会调查**为什么**'foreach' /'explode()'比'preg_match_all()'慢很多,可能会在这里丢弃另一个更新。 – hek2mgl 2013-02-08 17:43:42

+0

那会很好。我猜想在每次迭代中执行爆炸都会降低速度。 preg_match在较低的层次上完成这项工作。 – Aley 2013-02-08 17:50:11