从字符串中删除除具有特定模式的日期之外的所有内容
Remove everything from a string except a date with a certain pattern
我试图从 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})$
您可以替换 ^
(匹配字符串位置的 start)和 $
(匹配 end[=字符串位置的 28=])和 \b
(单词边界)将日期子字符串匹配为整个单词,并使用 preg_match
(仅提取第一个匹配项)或 preg_match_all
(如果有不止一个):
preg_match('~\b(?:0?[1-9]|[12][0-9]|3[01])([./-])(?:0?[1-9]|1[0-2])(?:[0-9]{4}|[0-9]{2})\b~', $s, $matches);
单词边界的替代方法可以是 (?<!\d)
和 (?!\d)
环视(如果日期可以粘在字母上或出现在下划线之间,这将很有帮助):
preg_match('~(?<!\d)(?:0?[1-9]|[12][0-9]|3[01])([./-])(?:0?[1-9]|1[0-2])(?:[0-9]{4}|[0-9]{2})(?!\d)~', $s, $matches);
如建议的那样,有一个替代方法,您可以匹配日期格式 \d{1,2}-\d{1,2}-\d{4}
并创建一个 DateTime and perhaps specify the format 来验证它是一个有效日期。
要仅替换第一个日期,您可以使用 preg_match and 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>";
}
}
我试图从 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})$
您可以替换 ^
(匹配字符串位置的 start)和 $
(匹配 end[=字符串位置的 28=])和 \b
(单词边界)将日期子字符串匹配为整个单词,并使用 preg_match
(仅提取第一个匹配项)或 preg_match_all
(如果有不止一个):
preg_match('~\b(?:0?[1-9]|[12][0-9]|3[01])([./-])(?:0?[1-9]|1[0-2])(?:[0-9]{4}|[0-9]{2})\b~', $s, $matches);
单词边界的替代方法可以是 (?<!\d)
和 (?!\d)
环视(如果日期可以粘在字母上或出现在下划线之间,这将很有帮助):
preg_match('~(?<!\d)(?:0?[1-9]|[12][0-9]|3[01])([./-])(?:0?[1-9]|1[0-2])(?:[0-9]{4}|[0-9]{2})(?!\d)~', $s, $matches);
如建议的那样,有一个替代方法,您可以匹配日期格式 \d{1,2}-\d{1,2}-\d{4}
并创建一个 DateTime and perhaps specify the format 来验证它是一个有效日期。
要仅替换第一个日期,您可以使用 preg_match and 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>";
}
}