我试图从foreach中从数据库中获取的字符串中删除除日期(dd-mm-yyyy)之外的所有内容。
我可以删除所有文字([A-Z] [a-z]等),但文字之间还有数字。
$strings = [
'Originele startdatum ',
'Op verzoek van klant de ingangsdatum gelijkgetrokken met alle andere abonnementen zodat er maar 1 factuur wordt verstuurd.'
];
$result[] = [
'AboOpmerking' => str_replace($strings, '', $row['AboOpmerking']),
];
未触动过的弦看起来像这样:
示例1:
Originele startdatum 3-10-2017
示例2:
Originele startdatum 1-1-2014 Op verzoek van klant de ingangsdatum gelijkgetrokken met alle andere abonnementen zodat er maar 1 factuur wordt verstuurd。
我发现了这个正则表达式,但我不知道如何使用它,因为当我打印$matches
时,它会给我一个空数组
^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$
答案 0 :(得分:1)
您可以将^
(与字符串位置的 start 匹配)和$
(与字符串位置的 end 匹配)替换为\b
preg_match
(单词边界)将日期子字符串与整个单词匹配,并使用preg_match_all
(仅提取第一个匹配项)或preg_match('~\b(?:0?[1-9]|[12][0-9]|3[01])([./-])(?:0?[1-9]|1[0-2])\1(?:[0-9]{4}|[0-9]{2})\b~', $s, $matches);
(如果有多个):
(?<!\d)
请参阅regex demo
字边界的替代方法可以是(?!\d)
和preg_match('~(?<!\d)(?:0?[1-9]|[12][0-9]|3[01])([./-])(?:0?[1-9]|1[0-2])\1(?:[0-9]{4}|[0-9]{2})(?!\d)~', $s, $matches);
外观(如果日期可以粘贴到字母或显示在下划线之间,则会很有用):
{{1}}
答案 1 :(得分:1)
根据建议,您可以选择匹配格式为\d{1,2}-\d{1,2}-\d{4}
的日期并创建DateTime,也可以指定format来验证它是否为有效日期。
要仅替换第一个日期,您可以使用preg_match和preg_replace并指定1作为第四个参数,仅执行1次替换。
$strings = [
'Originele startdatum 3-10-2017',
'Originele startdatum 3-10-2017 3-10-2018 ',
'Originele startdatum 1-1-2014 Op verzoek van klant de ingangsdatum gelijkgetrokken met alle andere abonnementen zodat er maar 1 factuur wordt verstuurd.'
];
$pattern = '/\d{1,2}-\d{1,2}-\d{4}/';
foreach ($strings as $string) {
if (preg_match($pattern, $string, $matches) === 1 && false !== DateTime::createFromFormat('d-m-Y', $matches[0])) {
echo preg_replace($pattern, "", $string, 1) . "<br>";
}
}