2011-04-21 326 views
2

我在使用preg_match查找和替换字符串时遇到问题。感兴趣的字符串是:使用preg_match替换字符串

<span style="font-size:0.6em">EXPIRATION DATE: 04/30/2011</span> 

我需要一个不同的日期到目标并更换之日起,“2011年4月30日”。有人可以扔我骨头给我正则表达式来匹配这种模式在PHP中使用preg_match?我还需要以这样的方式来匹配,只替换到第一闭合跨度和代码不关闭span标签后,如:

<span style="font-size:0.6em">EXPIRATION DATE: 04/30/2011</span><span class="hello"></span> 

我不精通正则表达式,虽然我我花了最后一小时努力学习足够的工作,我完全失败了。非常感谢!

编辑:正如你所看到的,这让我筋疲力尽。我的意思是preg_replace,而不是preg_match。

回答

4

如果你是一个置换后,可以考虑使用preg_replace(),像

preg_replace('@(\d{2})/(\d{2})/(\d{4})@', '<new date>', $string); 
+0

这工作完美!谢谢布朗先生。认真......这是一个巨大的帮助! – tollmanz 2011-04-21 23:22:13

+0

@Sardine:它通常是一个好主意,标记为“接受”,如果它解决您的问题:) – 2011-04-21 23:24:00

+0

@Brecht答案:谢谢!我想,它不会让我:(系统说我不得不等待4分钟。谢谢你的提示!比斜杠其他 – tollmanz 2011-04-21 23:26:23

1

正则表达式应该是:

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d 

如果你想只匹配一个实例,这是确定。对于多个实例,请改用preg_match_all。取自http://www.regular-expressions.info/regexbuddy/datemmddyyyy.html

编辑:你正在寻找一个PHP脚本内搜索和替换,或者你想做一些JavaScript的替代?

+0

我喜欢日间和月份验证,但第一年是有点限制(仅限20世纪和21世纪) – Phil 2011-04-21 23:25:40

3

如何:

$toBeFoundPattern = '/([0-9][0-9])\/([0-9][0-9])\/([0-9][0-9][0-9][0-9])/'; 
$toBeReplacedPattern = '$2.$1.$3'; 

$inString = '<span style="font-size:0.6em">EXPIRATION DATE: 04/30/2011</span>'; 

// Will convert from US date format 04/30/2011 to european format 30.04.2011 
echo preg_replace($toBeFoundPattern, $toBeReplacedPattern, $inString); 

,并打印

EXPIRATION DATE: 30.04.2011 

模式总是开始和结束与所谓的分隔字符相同。通常使用字符/。

$ 1引用字符串,该字符串匹配由[[0-9] [0-9])匹配的第一个字符串,$ 2引用为(...)和$ 3,最后一个匹配的四个字母(...) )。

匹配单个字符,这是括号内列出的一个字符。例如。 [a-z]匹配所有小写字母。

要使用模式中特殊含义的字符/内部,您需要通过\转义它以使其成为字面斜杠字符。

更新:使用下面指出的{..}是重复模式的简写。

+0

模式机箱可字符(请参阅我的答案),他们只需要保持一致。 – Phil 2011-04-22 00:02:10

+1

谢谢指出。更新了我的答案。 – SteAp 2011-04-22 00:03:34

+0

谢谢!绝对有助于完善比赛! – tollmanz 2011-04-23 20:30:44