2012-06-04 54 views
1

PHP REGEX是我的一個弱點,但我仍然設法使用在線工具完成一些工作。考慮以下幾點:PHP regex sytax with preg_replace

一般遵循這一模式中的主題字符串:1551 UTC 04 2012年6月

我想提取「04」,用低於其分配給$ day變量:

$day = preg_replace("/^([0-9]{4})\s([A-Z]{3})\s([0-9]{2})\s([A-Za-z]{3,})\s([0-9]{4})$/", "$3", $weather['date']); 

這適用於以下網站:http://sqa.fyicenter.com/Online_Test_Tools/Test_Regular_Expression_Search_Replace.php

但我不能讓它在我的腳本中工作... $ day將等於整個主題字符串。

+1

你試過'$天=日期( 'd',的strtotime($天氣[ '日期'])) ;' – sesser

+2

我剛剛測試過它,它完美的工作;你必須做一些其他的錯誤(當你var_dump()'$ weather ['data']')時會發生什麼?) – Jeroen

+0

@randy當然,確實會返回一個01 ...我不認爲$ weather的格式strtotime()可以使用['date']。我實際上試圖提取$ weather ['date']的不同部分來創建一個strtotime()可以使用的字符串。 – WhiskeyMike

回答

2

您的var_dump()的結果是string(38) "1551 UTC 04 June 2012 "。它有38個字符,而它應該只有21個字符。所以它看起來像字符串中有多個空格。

嘗試trim()您輸入的字符串,並與\s+取代\s支持多個空格:

$day = preg_replace("/^([0-9]{4})\s+([A-Z]{3})\s+([0-9]{2})\s+([A-Za-z]{3,})\s+([0-9]{4})$/", "$3", trim($weather['date'])); 
+0

我認爲你在做某件事。使用上述,仍然不工作,但我設法把它降到31個字符...(與「+」量詞連接到空白「\」 – WhiskeyMike

+0

使用你的邏輯,我能夠得到它的工作。我沒有用空白符號代替句號(。)元字符,現在我很高興這個作品,但是它留下了另一個問題,還有什麼其他的字符被添加了,我看不到? – WhiskeyMike

+0

好吧,它看起來像它們是非空白但未打印的字符,可能是'ESC','DEL','NULL'或其他。 – flowfree

0

你說preg_replace,但我想你想使用preg_match()。這是正確的,你不想取代「04」,但你只是想把它變成一個變量$日?如果這樣使用preg_match()。在你的描述中,你說你只想捕獲「04」部分,但是你的正則表達式有很多捕獲組(在「()」中的任何東西都是一個捕獲組,並將返回給你給preg_match的數組)。

+0

http://www.php.net/manual/en/function.preg-match.php – solidau

+0

你是絕對正確的,但是他使用preg_replace()**的方式應該工作;使用preg_match不會解決他的問題 – Jeroen

+0

同意它應該工作,但'preg_match'會立即返回所有相關的部分。 – Herbert