PHP basit düzenli ifade ile sorun

6 Cevap php

Benim sorunu açıklamak için en iyi yolu, sadece size göstermektir.

Input String:

/04-11-2010/12:45/

Regular Expression to get date and time parts:

preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d):(\d\d)/@', $input, $matches);

PHP Matches Array:

Array
(
    [0] => /01-11-2010/12:45/
    [1] => 01
    [2] => 11
    [3] => 2010
    [4] => 12
    [5] => 45
)

Şimdi yukarıdaki regex giriş dizesi tarih ve saati temsil münferit yedek parçalarının getting mükemmel çalışıyor.

Sorun zaman parçası düzenli ifadenin tamamı aşağı getirerek olmadan isteğe bağlı olması gerekiyor.

Problem Input String:

/04-11-2010//

PHP Matches Array

Array
(
)

Temelde ne karşılaşmalar dizisi tarafından iade edilmesi gerekenler:

Array
(
    [0] => /01-11-2010/12:45/
    [1] => 01
    [2] => 11
    [3] => 2010
    [4] => 
    [5] => 
)

Not dizi elemanları 4 ve 5 hala var ama boş dönmek gerekiyor.

6 Cevap

Şeyler isteğe yapmak için soru işareti operatörü ve olmayan bir yakalama grubunu kullanın.

@/(\d\d)-(\d\d)-(\d\d\d\d)/(?:(\d\d):(\d\d))?/@

Ben bu maç dizi ile etkileşim nasıl emin değilim - boş dizi öğelerini sahip kesinlikle kritik ise, bunun yerine gitmek gerekebilir

@/(\d\d)-(\d\d)-(\d\d\d\d)/((?:\d\d)?):?((?:\d\d)?)/@

Kendi sahte-pozitif sahip olan (zaman içinde kolon artık isteğe bağlıdır).

Düzenli ifadeler kullanarak, bu görev için doğal PHP fonksiyonları kullanmak bir overkill bir parçasıdır.

PHP 5 date_parse işlevi vardır:

$string = '/04-11-2010/12:45/';
$dateArray = date_parse(str_replace('/', ' ', $string));
print_r($dateArray);

$string = '/04-11-2010//';
$dateArray = date_parse(str_replace('/', ' ', $string));
print_r($dateArray);

Çıktı:

Array
(
    [year] => 2010
    [month] => 11
    [day] => 4
    [hour] => 12
    [minute] => 45
    [second] => 0
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 
)

Array
(
    [year] => 2010
    [month] => 11
    [day] => 4
    [hour] => 
    [minute] => 
    [second] => 
    [fraction] => 
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 
)

PHP 5.3 de kullanabilirsiniz daha esnek bir date_parse_from_format işlevi vardır.

Ikinci bölüm isteğe bağlı olun:

'@/(\d\d)-(\d\d)-(\d\d\d\d)/(?:(\d\d):(\d\d))?/@'

İşte böylece başvurulan ve olamaz olmayan bir yakalama grubu (?:…) kullanılan eşleşen grupları değişmez.

  @/(\d\d)-(\d\d)-(\d\d\d\d)/((?:\d\d)?):?((?:\d\d)?)/@

Ne istediğinizi (yani gruplar 4 ve 5 doldurur), ama aynı zamanda gibi eksik sürelerini kabul etmez

    /04-11-2010/12:/

Bu ince Seninle olup olmadığını bilmiyorum

Ben bir php-kafa değilim, ama nasıl:

preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d)?:?(\d\d)?/@', $input, $matches);

Bildiğim kadarıyla regexp'nin gitmek gibi, hiçbir zaman alanı olan bir dize eşleşmesi gerekir.

@ OP, dağınık regex gerekmez.

$str="/04-11-2010/12:45/";
$s = array_filter(explode('/',$str));
$date=$s[1];
$time=$s[2];
$date_parts=explode("-",$date);
$time_parts=explode(":",$time);
if ( checkdate($date_parts[1],$date_parts[0],$date_parts[2]) ){
    print "date ok\n";
}