preg_match不像在线测试那样工作

时间:2015-12-26 18:54:31

标签: php regex unit-testing

我有代码来分割重量和立方体数量和单位。 例如540ml到" 540"和" ml" preg_match的数字部分工作正常,但数组中的preg_match单位返回仅为" m"。

当我在线测试时,这个正则表达式也可以。但我不知道为什么php只在数组中返回第一个字母。我尝试了所有正则表达式,但它没有用。但

preg_match("/.[0-9]*/", $string, $number);<br/>
preg_match("/[(ml)(g)(kg)(l)]{1,1}[(ml)(g)(kg)(l)]{0,1}/", $string, $unit);

1 个答案:

答案 0 :(得分:1)

第二个preg_match无法正常工作的原因是方括号中的字母被视为原子字母而没有任何序列感。因此,匹配与其中任何一个匹配,但不是串联。

因此,即使您将(ml)放在第一个方括号部分,它也会匹配“m”“l”,无论哪个是当前的性格,但不是两者。它甚至会匹配括号,因为它们被视为方括号内的任何其他字符。

因此,您的总表达式将匹配“kg”“gk”,还有“)g” “m(”。你真正需要的是管道(|)运算符,它作为OR运行。

第一个正则表达式也存在问题,因为第一个字符可以是任何字符(.的含义)。您可能希望确保匹配至少一位数。为此,您应该使用+运算符(而不是*)。

此外,通过使用括号表示的捕获组,您可以将两个部分与一个正则表达式完美匹配。

综合以上所有内容,你得到了这个:

$string = "123kg";

preg_match("/\b([0-9]+)(ml|g|kg|l)\b/", $string, $parts);

if (count($parts)) {
    echo "number: " . $parts[1] . "<br />" . 
        "unit: " . $parts[2] . "<br />";
} else {
    echo "no match";
}

输出:

  

号码:123

     

单位:kg