2012-04-24 60 views
0

我不願意問,但我無法弄清楚php preg_replace和忽略某些部分的刺痛。php preg_replace挫折

$string = '2012042410000102'; 

$字符串需要看起來像_0424_102

放映數字變量總是在不斷變化和2012年曾經的修改今年

我已經試過:

^\d{4}[^\d{4}]10000[^\d{3}]$ 
^\d{4}[^\d]{4}10000[^\d]{3}$ 

任何幫助不勝感激。我知道這是一個簡單的問題,但對任何人來說都很簡單。

感謝

+1

本質上講,你要替換的前四位和「10000」用下劃線? – Wiseguy 2012-04-24 20:19:27

+0

如果你寫'[^ \ d]'它意味着匹配非小數。 – mario 2012-04-24 20:20:27

+0

@Wiseguy yup這就是全部 – knittledan 2012-04-24 21:18:48

回答

1

嘗試以下操作:

^\d{4}|10000(?=\d{3}$) 

這將匹配的前四位中一個字符串,或者如果在字符串結束之前有'10000'之後有三位數字,那麼字符串'10000'。

你會使用這樣的:

preg_replace('/^\d{4}|10000(?=\d{3}$)/', '_', $string); 

http://codepad.org/itTgEGo4

+0

你會如何做兩個分隔符? 2012年第一部分的空白空間和_100000空白空間? – knittledan 2012-04-24 21:39:16

+0

@knittledan - 爲此,您可能需要使用類似Kolink的解決方案,您可以匹配整個字符串,並使用捕獲組來保留不想刪除的部分。 – 2012-04-24 21:53:54

3

您的第一個正則表達式是在尋找:

  • 字符串的開始
  • 四位數(年份)
  • 任何單個字符不是一個數字,也不{或}
  • 數字10000
  • 任何單個字符不是一個數字,也不{或}
  • 字符串的結束

你的第二個正則表達式正在尋找:

  • 字符串的開始
  • 四位數(年份)
  • 任意四軸CHARAC TER值不是數字
  • 數10000
  • 任何三個字符不是數字
  • 字符串

你要找的是正則表達式的結尾:

^\d{4}(\d{4})10000(\d{3})$ 

而且替換應該是:

_$1_$2 

此正則表達式查找:

  • 字符串的開始
  • 四位數(年份)
  • 捕捉四位(月,日)
  • 數10000
  • 捕獲三位數字(102最後在你的例子中)
  • 字符串的結束
+0

感謝您的解釋 – knittledan 2012-04-24 21:20:12

0

如果他們在同一個字符的位置始終是,正則表達式似乎是不必要的。你可以使用子得到你想要的部分,如

sprintf('_%s_%s', substr($string,4,4), substr($string,13)) 

'_' . substr($string,4,4) . '_' . substr($string,13)