2012-09-29 58 views
1

我遇到一個奇怪的問題preg_replace。它似乎通常使用單個字符串,但是當我帶一個大文本文件(〜1.5MB)時,它似乎什麼都不做。preg_replace和大文本文件解析

我試圖解析鍵值的一個大的文本文件,它具有這樣的結構:

"KeyValues" 
{ 
    "Key1" "Value1" 
    // a comment 
    "ComplexKey" 
    { 
     "ComplexKey1" "ComplexValue1" // another comment 
     "ComplexKey2" "ComplexValue2" 
     "FurtherComplexity1" 
     { 
      "ComplexKey3" "ComplexValue3" 
      "ComplexKey4" "ComplexValue4" 
     } 
    } 
} 

我想我做任何分析之前,請從文本文件中的註釋。 preg_replace看起來像是一個安全的賭注。下面是隻刪除評論中的代碼:

<?php 

$filecontent = file_get_contents('file.txt'); 
$filecontent = preg_replace('!//.*!s', '', $filecontent); 

echo $filecontent; 

?> 

現在,我期待它輸出上面的例子沒有評論,但它只是返回它的開始是完全一樣的字符串。這樣會很奇怪,雖然是我採取單一線路輸出從文本文件,比如這一個:

 "ComplexKey1" "ComplexValue1" // another comment 

我可以運行該字符串的preg_replace調用,它會不註釋返回字符串。我想也許是因爲有一些換行符與正則表達式不匹配,所以我在表達式中添加了's'修飾符;然而,這似乎並沒有解決問題。無論出於何種原因,我的preg_replace調用都不會做任何事情(或者我的正則表達式關閉)。

一個明顯的解決方案就是忽略解析中的註釋,但我在想這裏面一定有一些東西我不知道爲什麼這不起作用。如果可能的話,我真的很想在不更改解析器的情況下解決這個問題。有任何想法嗎?

+0

您正在使用* s(PCRE_DOTALL)*修飾符,您應該瞭解它的第一手功能。不只是嘗試和想知道,而且還有理解。 http://php.net/manual/en/reference.pcre.pattern.modifiers.php – hakre

+0

你也可能想將該文件格式轉換成支持的東西,比如JSON或YAML。解析這些的庫已經存在(但JSON沒有評論)。 – hakre

回答

3
$filecontent = preg_replace('!//.*$!m', '', $filecontent); 

m改性劑改變輸入文本的處理通過線對線

默認情況下,PCRE治療受試者字符串作爲由字符(即使它實際上包含一個單一的「線」的幾條新線)。 「起始行」元字符(^)僅匹配字符串的開頭,而「行尾」元字符($)僅匹配字符串末尾或終止換行符之前(除非設置了D修飾符)。這與Perl相同。當這個修飾符被設置時,「起始行」和「行結束」構造分別緊跟在主題字符串中的任何換行符之後或之前,以及在最開始和結束時匹配。這相當於Perl的/ m修飾符。如果主題字符串中沒有「\ n」字符,或者模式中沒有出現^或$,則設置此修飾符不起作用。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

而且'。'不匹配換行符,它使用* s(PCRE_DOTALL)*。 – hakre

+0

我不明白爲什麼 - 但我的問題是通過將文本文件中的所有文本複製到新文本並在新文本文件上運行代碼來解決的......現在運行得很好(甚至沒有實現在這裏改變)。 – canadiancaper

+0

@canadiancaper:您當前的代碼意味着:「從第一個」//「條目到文件尾部的所有內容」 – zerkms

0

這看起來像JSON

你可以使用

json_decode($mydata,true) 

把你的整個文本文件轉換成一個漂亮的多層次PHP數組。