将包含值范围的字符串解析为最小和最大变量v2

tpu*_*nen 1 php

我需要根据以下规则将字符串解析为两个变量,并且我正在寻找在PHP中实现此目的的最佳方法:

"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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我必须使用减去负值和范围分隔符.

这与我之前的问题非常相似:

将包含值范围的字符串解析为最小和最大变量

(我已经发布了第二个问题,但发现我弄乱了桌子.希望现在好了.)

sou*_*rge 5

尽管我试图避免正则表达式,但在这种情况下我会使用一个.我认为这应该匹配你的所有字符串:

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

(正则表达式的长度是在日常编码中避免它们的一个很好的理由)


xto*_*ofl 5

当遇到这样的问题时,你可以尝试用某种Backus-Naur形式表达它:

Range := Number | Number "-" Number
Number := Sign Digits
Sign := "" | "-"
Digits := Digit* | Digit* "."  Digit*
Run Code Online (Sandbox Code Playgroud)

并从中创建一个正则表达式.