2015-09-29 84 views
1

我想用相應的輸入字段替換日期模式字符串(intl擴展名)。preg_replace:忽略已替換的部分

模式可以是:

dd.MM.yy 
dd.MM.yyyy 
M/d/yy 
M/d/yyyy 
dd/MM/y 
dd/MM/yyyy 

我的代碼是:

$date_pattern = 'M/d/yy'; 

$search = array('/[d|dd]/', '/[M|MM]/', '/[y|yy|yyyy]/'); 
$replace = array(
'<input type="text" name="day" size="2" maxlength="2">', 
'<input type="text" name="month" size="2" maxlength="2">', 
'<input type="text" name="year" size="4" maxlength="4">'); 

print preg_replace($search, $replace, $date_pattern); 

問題是,認爲 「的preg_replace」 匹配已經在第一替換輸入字段的位置處:

<input t[here because of the 'y' character]pe="text" ...> 

有什麼辦法可以告訴preg_replace忽略已經更換的零件嗎?

+0

見http://stackoverflow.com/questions/11361943/php-preg-更換功能,更換,先前的比賽。說實話,要麼只是製作一個正則表達式並且一次替換所有的部分就更簡單了,但我認爲對於你的具體問題的答案是你不能。 –

回答

2

你的正則表達式看起來不對,因爲[d|dd]只匹配d或文字|。在您的正則

更好地使用單詞邊界,因爲這:

$search = array('/\bd{1,2}\b/', '/\bM{1,2}\b/', '/\b(?:y{1,2}|y{4})\b/i'); 
print preg_replace($search, $replace, $date_pattern); 

輸出:

<input type="text" name="month" size="2" maxlength="2">/<input type="text" name="day" size="2" maxlength="2">/<input type="text" name="year" size="4" maxlength="4">

+0

'y {1,4}'也與'yyy'匹配。 – Gumbo

+1

順便說一句:你的模式導致:'/「size =」2「maxlength =」2「>/'。再次檢查單詞邊界。 – Gumbo

+0

謝謝@Gumbo,是的,在ioseb的編輯中存在一個問題。現在已經糾正了。 – anubhava