2013-11-22 102 views
0

我有一個正則表達式模式,可以過濾出一些特定的值。編碼正則表達式在PHP

我試着在PHP中運行模式,但它總是返回NULL值。

$re1='^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$'; 


preg_match($re1, $current_line, $matches); 


var_dump($matches); 

樣品$ current_line變量值 -

122.99.152.202 - naveen [22/Nov/2013:13:24:40 +1300] "GET /p/bhYg_TohdFLAxXoNBgIEbg,1385079896,119118112/12.txt HTTP/1.1" "302" "160" "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36" "-" 

我在哪裏做錯了嗎?

+3

PHP需要對正則表達式定界符:http://php.net/manual/en/regexp.reference.delimiters.php –

+0

Nginx的使用與Apache組合格式兼容的格式 – mcuadros

+0

@mcuadros我有一個自定義日誌格式。 –

回答

2

您沒有爲您的正則表達式設置分隔符。

分隔符可以是任何非字母數字,非反斜槓,非空白字符。

你想使用除了/分隔符這樣可以儘量避免在你的方式逃避/ S:

$re1 = '~^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$~'; 

working demo

如果你願意,你可以壓縮一點點。

$re1 = '~^((?:\d{1,3}\.?){4}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$~i';