Php preg_match ve regex kullanarak bir dize tarih patlayabilir nasıl

4 Cevap php

Bunu bir yerlerde bir tarih dizeleri işliyorum. Tarih bu dize görünür farklı yolları vardır:

"… 01.11.2009 18:00-21:00 …" or "… 01.11.2009 18:00-02.11.2009 15:00 …" or "… 01.11.2009 18:00 …"

Tarih görünür olursa olsun nasıl sadece başlangıç ​​tarihini "01.11.2009 18:00" gerekir. Iki maçı varsa Yani sadece ilki. Nasıl ayırabilirsiniz / php tam dizeden bu patlayabilir. Herhangi bir fikir?

Ben regex ile bir desen oluşturmak gerekiyor ve sonra preg_match ile eşleşen sanırım. Bu yolu var mı? Ne yazık ki ben çok regex değilim. Herkes rastgele bir dize benim tek tarih blok alma ile yardımcı olabilir?

4 Cevap

Deneyin:

$s = "… 01.11.2009 18:00-21:00 …… 01.11.2009 18:00-02.11.2009 15:00 …… 01.11.2009 18:00 …";
preg_match_all('!(\d{2}\.\d{2}\.\d{4}) \d{2}:\d{2}(-\d{2}:\d{2}|-\d{2}\.\d{2}\.\d{4} \d{2}:\d{2})?!', $s, $matches);
print_r($matches[1]);

tarih aşağıdaki şekilde biçimlendirilmiş olup olmadığını her zaman her tarih için karakter aynı sayıda sahip olacak. Daha sonra başlangıç ​​X karakter almak için basit substr () kullanabilirsiniz:

// example date strings
$date = date('m.d.Y h:i:S');
$date2 = date('m.d.Y h:i:S', strtotime('+50 days'));
$date_str = $date . '-' . $date2;

// get the first 10 characters for the date
$match = substr($date_str, 0, 10);

Bunu dene:

preg_match_all(
    '/([0-9]{2}\.[0-9]{2}\.[0-9]{4} [0-9]{2}:[0-9]{2})' // linebreak added
    . '(?:-(?:[0-9]{2}\.[0-9]{2}\.[0-9]{4} )?(?:[0-9]{2}:[0-9]{2})?)?/',
    '" 01.11.2009 18:00-21:00 " or " 01.12.2009 18:00-02.12.2009 15:00 " '
    . 'or " 01.01.2009 18:00 "',
    $matches
);

print_r($matches[1]);
// "01.11.2009", "01.12.2009", "01.01.2009"

Aşağıdaki fonksiyonu kullanarak bu biçimde ilk tarih çıkarabilir:

function find_date($string) {
    preg_match("/\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}/",$string,$matches);
    return $matches[0];
}