我正在尝试从“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”?
答案 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);
它仅使用组的内容替换字符串,这正是日期部分。