2012-04-24 109 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)