2013-02-08 54 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