2012-02-27 64 views
0

後試圖總結我的周圍模式匹配的頭個小時,我扔毛巾和轉向專家...正則表達式的幫助(PHP)

我有我想要一個日誌文件從中提取字符串。

的格式是這樣的:

12:00 SomeText: 
1:20 MoreText: 

的 「SomeText/MoreText」 是我需要得到。我想出了下面的代碼,但沒有得到任何靠近的結果我很期待:

$string = "12:00 SomeText: blah, blah, blah not important"; 
$regex = '/[0-9]:[0-9] (.*?)\: /'; 
$entity = preg_split($regex, $string); 

我的理解是正則表達式的邏輯,任何數字,後跟一個冒號,後跟任意數量的,接下來是空格,後面是冒號,然後是空格

向正確的方向推進將不勝感激!

感謝 克里斯

+0

您能否擴展您收到的格式?什麼是分隔符?空格,標籤...? – m0skit0 2012-02-27 15:33:26

回答

3

你匹配一個數字,一個冒號,然後是個位數。

$string = "12:00 SomeText: blah, blah, blah not important"; 
$regex = '/[0-9]+:[0-9]+ ([^:]+)/'; 
$entity = array(); 
preg_match($regex, $string, $entity); 

這將匹配一個或多個數字,冒號,一個或多個數字,其餘。 preg_match將會把整個表達式匹配位置0(12:00某些文本),之後匹配的子表達式(某些文本),那麼你的「一些文本」將在$entity[1]

[編輯] 的討論後在評論中,我改進了與頭部的匹配。之前,您有

(.*?)\: 

它將查找任何字符,直到字符串的末尾(可選),然後回溯到找到冒號。我用

([^:]+) 

替換它會找到一個或多個不是冒號的字符並匹配它們。這樣可以避免查看「blah,blah,blah ...」的正則表達式,然後忽略剛剛找到的正則表達式。

+1

打敗我吧。儘管我不明白爲什麼第二個冒號逃脫了。 – 2012-02-27 15:34:19

+0

我以爲他有這個,因爲他只想要標題,時間和冒號之間的部分作爲標題分隔符。 @克里斯斯普拉格,如果你可以澄清這一點,我可以使正則表達式更有效率。 – 2012-02-27 15:35:45

+0

的確,我試圖抓住字符串的「SomeText」部分。 – 2012-02-27 15:38:15