2015-10-14 53 views
0

我想从“字符串2015-08-20”只提取日期部分。preg_replace  变成数字

$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

'$ date = preg_replace(“#^。*?;#”,'',$ original);' –

+0

[** norepro **](https://3v4l.org/FILIUe) – Rizier123

回答

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]); 
0

你得到160可能是因为你正在处理非换空间,在 格式,但在 格式不表达的字符串。考虑到用你的正则表达式替换字符串string 2015-08-20中所有不是数字或超级的字符,它会保留160,所以结果是1602015-08-20
这是种系发生在他的回答中描述和解决的确切情况。

这里有一个更简洁的解决方案:

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

它取代了串同组的唯一内容,这正是日期部分。