En az değer aralığını içeren dize ve max değişkenleri v2 Ayrıştırma

4 Cevap

Ben aşağıdaki kurallara göre iki değişken bir dize ayrıştırmak gerekiyor, ve ben PHP bunu başarmak için en iyi yol arıyorum:

"40.3" -> minval=40.3, maxval=40.3
"-40.3" -> minval=-40.3, maxval=-40.3
"40.3-60.76" -> minval=40.3, maxval=60.76
"-40.3-60.76" -> minval=-40.3, maxval=60.76
"-60.76--40.3" -> minval=-60.76, maxval=-40.3

Ne yazık ki ikisi de negatif değerler, hem de aralık ayırıcı için eksi kullanmak zorunda.

Bu benim önceki soruya oldukça benzer:

http://stackoverflow.com/questions/1666390/parse-string-containing-range-of-values-to-min-and-max-variables

(Ben zaten bir kere bu ikinci soruyu yayınlanmıştır ama ben tabloyu berbat olduğunu fark ettim. Umarım şimdi iyi.)

4 Cevap

Her ne kadar ben normal ifadeler önlemek için deneyin, ben bu durumda birini kullanmak istiyorum. Ben bu tüm dizeleri eşleşmesi gerektiğini düşünüyorum:

preg_match('/^(?P<min>-?\d+(\.\d+)?)(-(?P<max>-?\d+(\.\d+)?))?/', $string, $matches);
$min = $matches['min'];
if (isset($matches['max'])) {
     $max = $matches['max'];
}

(Normal ifadenin uzunluğu gün-gün kodlama bunları önlemek için iyi bir nedendir)

Böyle bir sorunla karşılaşıldığında zaman, Backus-Naur tür form bunu ifade deneyebilirsiniz:

Range := Number | Number "-" Number
Number := Sign Digits
Sign := "" | "-"
Digits := Digit* | Digit* "."  Digit*

Ve bu bir düzenli ifade oluşturun.

Eğer normal ifadeler kullanmak istemiyorsanız, bu işlevi onu yapacağız:

function parse_range($range) {
    list($from, $to) = explode('-', substr($range, 1), 2);
    $from = $range[0] . $from;
    if (!$to and $to !== '0') {
        $to = $from;
    }
    return array($from * 1, $to * 1);
}

Bu bir test oldukça iyi çalıştı:

<?php
preg_match("/^(\-{0,1}[0-9\.])\-{0,1}(\-{0,1}[0-9\.]*)\$/", "-1-2", $matches);
$min = $matches[1];
$max = $matches[2] ? $matches[2] : $min;
?>