preg_replace变成了数字

时间:2015-10-14 16:34:32

标签: php regex preg-replace

我正在尝试从“2015-08-20”字符串中仅提取日期部分。

$original = "string 2015-08-20";

// Trying to remove all but numbers and dashes
$date = preg_replace("#[^0-9-]#iu", '', $original);
// Expecting "2015-08-20"
echo $date;
// But ends up with "1602015-08-20"

为什么我的字符串前面会出现“160”?

2 个答案:

答案 0 :(得分:1)

你应该反过来这样做。搜索日期字符串,而不是尝试删除不是日期字符串的所有内容。

这将使代码更能抵抗意外情况(例如$original中不属于日期字符串的数字)。

$original = "string 2015-08-20";
preg_match('#\d{4}-\d{2}-\d{2}#', $original, $matches);

# string(10) "2015-08-20"
var_dump($matches[0]);   

答案 1 :(得分:0)

您得到160可能是因为在您处理的字符串中,不间断空格不是以 格式表示,而是以 格式表示。考虑到使用正则表达式替换所有不是数字或超出的字符,在字符串string 2015-08-20中它保留160,因此结果为1602015-08-20
这是Phylogenesis在他的回答中描述和解决的确切情况
这是一个更简洁的解决方案:

$original = "string 2015-08-20";
$date = preg_replace("#^.*(\d{4}-\d{2}-\d{2})$#", "$1", $original);

它仅使用组的内容替换字符串,这正是日期部分。