簡體   English   中英

從字符串中刪除除具有特定模式的日期以外的所有內容

[英]Remove everything from a string except a date with a certain pattern

我正在嘗試從在foreach中從數據庫中獲取的字符串中刪除除日期(dd-mm-yyyy)之外的所有內容。

我可以刪除所有文本([AZ] [az]等),但是文本之間也有數字。

$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 2017年3月10日

范例2:

Originele startdatum 1-1-2014 Op verzoek van klant de ingangsdatum gelijkgetrokken遇見了alle andere abonnementen zodat er maar 1個事實。

我找到了這個正則表達式,但是我不知道如何使用它,因為當我打印$matches時,它給了我一個空數組

^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$

您可以用\\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)(?!\\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);

如建議的那樣,有一種替代方法,您可以匹配日期,例如格式\\d{1,2}-\\d{1,2}-\\d{4}並創建DateTime並可能指定格式以驗證其為有效日期。

要僅替換第一個日期,可以使用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>";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM