除了具有特定模式的日期之外,从字符串中删除所有内容

时间:2018-03-30 08:00:02

标签: php regex preg-replace preg-match

我试图从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})$

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_matchpreg_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>";
    }
}