2016-03-15 33 views
0

我做錯了什麼?它仍然返回21-11-2016正則表達式最新錯誤?

$string = '21-11-2016'; 
$pattern = '/({0-9}(2))-({0-9}(2))-({0-9}(4))/'; 
$rep = "Month: $2 , Day: $1 , Year: $3"; 
echo preg_replace($pattern, $rep, $string); 
die(); 
+4

[有些人,當遇到一個問題,認爲 「我知道,我將使用正則表達式。」現在他們有兩個問題。](http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/):) – MonkeyZeus

+0

我個人會有'$ string = '21 -11-2016 「; $ e = explode(' - ',$ string); echo'implode'(',',array('Month:'。$ e [1],'Day:'。$ e [0],'Year:'。$ e [2]));' 。另外,有一百萬次迭代,我得到了'0.2秒vs'.4' :) – MonkeyZeus

回答

2

您有{..}(..)錯誤的地方。用途:

echo preg_replace('/([0-9]{2})-([0-9]{2})-([0-9]{4})/', $rep, $string); 

{...}使它成爲一個範圍,[...]使它成爲一個字符類。

+1

哦....該死的)時間去睡覺... TY –

1

這是你想要的圖案:

$pattern = '/(\d{2})-(\d{2})-(\d{4})/'; 

工作例如:https://3v4l.org/LYhvB

然而,正則表達式解析日期是不是一個好的做法。使用內置的日期功能!

0

因爲這不是一個有效的正則表達式。您已將[]{}顛倒過來。

[]定義字符類別和範圍,例如, [0-9]是「全部數字」。
{}定義了數量。例如{2}的意思是「以前的兩個」。
()定義了捕獲組。 (2)是毫無意義的。 - 你只是捕獲一個固定的2

既然你是向後的,那麼使用無效的{}範圍會產生語法錯誤,而且無論如何不會匹配任何東西。

嘗試

/([0-9]{2}-([0-9]{2})-([0-9]{4})/ 

代替

0

你的括號和大括號都搞砸了。它應該是這樣的。

([0-9]{2})-([0-9]{2})-([0-9]{4})

Regex101 Demo