[英]Remove everything except image tag from string using regular expression
[英]PHP - Regular expression to remove everything else but dates from a string
我正在從我的數據庫中提取一些數據以在.csv
文件中輸出。 這些輸出的行可能包含也可能不包含多種不同格式的兩個日期,包括:
YYYY-MM-DD (2019-02-01)
DD.MM.YYYY (01.02.2019)
D.M.YYYY (1.2.2019)
DD.MM.YY (01.02.19)
D.MM.YY (1.02.19)
D.MM.YYYY (1.02.2019)
這兩個日期通常位於字符串的末尾,但很少有日期位於字符串中間的情況。 以下是從數據庫輸出的一些示例行:
Product 1, 1.10.2018 - 31.12.2018 just a test string
Product 2 15.12.18-23.6.19
如果從字符串中找到,我現在想做的是將這兩個日期解析為一種格式(DD.MM.YYYY)到自己的變量中。
如果在字符串中找不到日期,則可以暫時忽略該行。 這是我迄今為止嘗試過的:
<?php
function contains_date($str) {
if (preg_match('/\b(\d{4})-(\d{2})-(\d{2})\b/', $str, $matches)) {
if (checkdate($matches[2], $matches[3], $matches[1])) {
return true;
}
}
return false;
}
$i = 0;
$table = [];
while($row = $stmt->fetch()) {
if(contains_date($row['product'])) {
$product = preg_replace('/\s+/', '', $row['product']);
$date = substr($product, -21);
$periodStart = date('d.m.Y', strtotime(substr($date, 0, 10)));
$periodEnd = date('d.m.Y', strtotime(substr($date, 11)));
}
$table[$i]['product'] = $row['product'];
$table[$i]['startDate'] = $periodStart;
$table[$i]['endDate'] = $periodEnd;
$i++;
}
?>
這適用於日期為 YYYY-MM-DD 格式以及在字符串末尾找到兩個日期的情況。 它不涵蓋日期格式不同的所有情況,也不涵蓋日期位於字符串中間的所有情況。 任何幫助將非常感激!
您可以使用同名組將不同的日期格式與一個正則表達式匹配:
$rx = '/(?J)(?<!\d)(?:(?<year>\d{4})-(?<month>\d{1,2})-(?<day>\d{1,2})|(?<day>\d{1,2})\.(?<month>\d{1,2})\.(?<year>\d{2}(?:\d{2})?))(?!\d)/';
請參閱正則表達式演示。
興趣點:
J
修飾符啟用一種模式中具有相同名稱的組(?<!\\d)
正則表達式開頭的負向后視在一個數字之后取消匹配(它匹配沒有緊跟數字前面的位置)(?!\\d)
正則表達式末尾的負前瞻在數字之前取消匹配(它匹配沒有緊跟數字的位置)$strs = ['YYYY-MM-DD (2019-02-01)', 'DD.MM.YYYY (01.02.2019)', 'D.M.YYYY (1.2.2019)','DD.MM.YY (01.02.19)','D.MM.YY (1.02.19)','D.MM.YYYY (1.02.2019)','Product 1, 1.10.2018 - 31.12.2018 just a test string','Product 2 15.12.18-23.6.19' ];
$rx = '/(?J)(?<!\d)(?:(?<year>\d{4})-(?<month>\d{1,2})-(?<day>\d{1,2})|(?<day>\d{1,2})\.(?<month>\d{1,2})\.(?<year>\d{2}(?:\d{2})?))(?!\d)/';
foreach ($strs as $s) {
echo "INPUT: $s\n";
if (preg_match_all($rx, $s, $matches, PREG_SET_ORDER, 0)) {
foreach ($matches as $m) {
echo "DAY: " . $m["day"] . "\nMONTH: " . $m["month"] . "\nYEAR: " . $m["year"] . "\n\n";
}
}
}
輸出:
INPUT: YYYY-MM-DD (2019-02-01)
DAY: 01
MONTH: 02
YEAR: 2019
INPUT: DD.MM.YYYY (01.02.2019)
DAY: 01
MONTH: 02
YEAR: 2019
INPUT: D.M.YYYY (1.2.2019)
DAY: 1
MONTH: 2
YEAR: 2019
INPUT: DD.MM.YY (01.02.19)
DAY: 01
MONTH: 02
YEAR: 19
INPUT: D.MM.YY (1.02.19)
DAY: 1
MONTH: 02
YEAR: 19
INPUT: D.MM.YYYY (1.02.2019)
DAY: 1
MONTH: 02
YEAR: 2019
INPUT: Product 1, 1.10.2018 - 31.12.2018 just a test string
DAY: 1
MONTH: 10
YEAR: 2018
DAY: 31
MONTH: 12
YEAR: 2018
INPUT: Product 2 15.12.18-23.6.19
DAY: 15
MONTH: 12
YEAR: 18
DAY: 23
MONTH: 6
YEAR: 19
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.