2009-11-23 2 views
1

V2, 나는 PHP에서이를 달성하는 가장 좋은 방법을 찾고 있어요 :구문 분석 문자열을 포함하는 범위는 min으로하고 최대 변수는 나는 다음과 같은 규칙에 따라 두 변수에 문자열을 구문 분석 할 필요가

"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

+0

그래, 그건 또한 – tputkonen

답변

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); 
} 
이러한 문제가 발생하는 경우 16,
5

, 당신은 배 커스 - 나 우어 형식의 일종으로 그것을 표현하는 시도 할 수 있습니다 :

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

그리고 그에서 정규 표현식을 만들 수 있습니다.

+0

괜찮은 regexes 태클에 대한 좋은 생각이야, 그리고 모든 regexes가 사소한 것이라고 주장 할 많은 사람들이있어! +1 – nickf

+0

+1 왜냐하면 난 그냥 BNFs 사랑 :) – krcko

관련 문제