Php 有条件的preg_替换用于可选的反向参考替换

Php 有条件的preg_替换用于可选的反向参考替换,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个正则表达式,可以将日期从“dd/mm/yyyy HH:ii:ss”重新格式化为yyyy-mm-dd HH:ii:ss,这很好,但我也会将其仅用于验证日期(当没有提供小时数时) 也许有一种方法可以为替换项提供默认值,但我没有找到它 $regex = '#^(\d{2})/(\d{2})/(\d{4})(?: (\d{2}):(\d{2})(?::(\d{2}))?)?$#'; $replace = '$3-$2-$1 $4:$5:00'; $str = '07/11/2013 20:3

我有一个正则表达式,可以将日期从“dd/mm/yyyy HH:ii:ss”重新格式化为yyyy-mm-dd HH:ii:ss,这很好,但我也会将其仅用于验证日期(当没有提供小时数时)

也许有一种方法可以为替换项提供默认值,但我没有找到它

$regex = '#^(\d{2})/(\d{2})/(\d{4})(?: (\d{2}):(\d{2})(?::(\d{2}))?)?$#';
$replace = '$3-$2-$1 $4:$5:00';


$str = '07/11/2013 20:30';
$val = preg_replace($regex, $replace, $str);
echo $val;  // "2013-11-07 20:30:00"

$str = '07/11/2013';
$val = preg_replace($regex, $replace, $str);
echo $val; // "2013-11-07 ::00"
您可以使用并提供自定义回调方法来执行替换。在回调函数中,可以应用默认值:

$regex = '#^(\d{2})/(\d{2})/(\d{4})(?: (\d{2}):(\d{2})(?::(\d{2}))?)?$#';
$replace = function ($m) {
    if (!$m[4]) $m[4] = '00';
    if (!$m[5]) $m[5] = '00';
    return "$m[3]-$m[2]-$m[1] $m[4]:$m[5]:00";
};

$str = '07/11/2013 20:30';
$val = preg_replace_callback($regex, $replace, $str);
echo $val;  // "2013-11-07 20:30:00"

$str = '07/11/2013';
$val = preg_replace_callback($regex, $replace, $str);
echo $val;  // "2013-11-07 00:00:00"

要验证日期和时间,请尝试以下操作:

$regex = '(\d{2})/(\d{2})/(\d{4}) (\d{2}):(\d{2}):(\d{2})';

这不是验证,而是替换。