2009-11-23 84 views
1

我需要按照以下規則將字符串解析兩個變量,我期待在PHP實現這一目標的最佳途徑:字符串,MIN和MAX變量v2的

"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 

不幸的是,我不得不使用負值和負值,以及範圍分隔符。

這非常類似於我前面的問題:(。我已經一次發佈第二個問題,但注意到,我把事搞砸表希望它現在是罰款)

Parse string containing range of values to min and max variables

+0

也有「-40.3」嗎? – xtofl 2009-11-23 11:51:48

+0

是的,這也可以接受 – tputkonen 2009-11-23 12:18:15

回答

5

由於就像我試圖避免正則表達式一樣,在這種情況下我會使用一個。我想,這應該符合您的所有字符串:

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

(正則表達式的長度是一個很好的理由,以避免他們在一天到一天的編碼)

1
$test = array(
    "40.3", 
    "-544", 
    "40.3-60", 
    "-40.1234-60.76", 
    "-60.76--40.3", 

); 

$num = "(-?\d+(?:\.\d+)?)"; 
$re = "~^$num-?$num?$~"; 
foreach($test as $test) { 
    if(preg_match($re, $test, $m)){ 
     if(!isset($m[2])) $m[2] = $m[1]; 
     echo "from $m[1] to $m[2]\n"; 
    } 
} 
1

這相當奏效的測試:

<?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; 
?> 
2

,如果你不想使用正則表達式,此功能將做到這一點:

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); 
} 
5

當遇到這樣的問題,你可以嘗試在某種巴科斯範式的表現吧:

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

,並創建一個正則表達式。

+0

這是一個處理非平凡正則表達式的好主意,而且有很多人會爭辯說所有正則表達式都是非平凡的! +1 – nickf 2009-11-23 13:34:52

+0

+1因爲我只是喜歡BNFs :) – krcko 2009-11-23 20:38:52