public static parseAnB ( $rule ) | ||
$rule | Some rule in the an+b format. |
public static function parseAnB($rule)
{
if ($rule == 'even') {
return array(2, 0);
} elseif ($rule == 'odd') {
return array(2, 1);
} elseif ($rule == 'n') {
return array(1, 0);
} elseif (is_numeric($rule)) {
return array(0, (int) $rule);
}
$regex = '/^\\s*([+\\-]?[0-9]*)n\\s*([+\\-]?)\\s*([0-9]*)\\s*$/';
$matches = array();
$res = preg_match($regex, $rule, $matches);
// If it doesn't parse, return 0, 0.
if (!$res) {
return array(0, 0);
}
$aVal = isset($matches[1]) ? $matches[1] : 1;
if ($aVal == '-') {
$aVal = -1;
} else {
$aVal = (int) $aVal;
}
$bVal = 0;
if (isset($matches[3])) {
$bVal = (int) $matches[3];
if (isset($matches[2]) && $matches[2] == '-') {
$bVal *= -1;
}
}
return array($aVal, $bVal);
}
public function testParseAnB() { // even $this->assertEquals(array(2, 0), Util::parseAnB('even')); // odd $this->assertEquals(array(2, 1), Util::parseAnB('odd')); // 5 $this->assertEquals(array(0, 5), Util::parseAnB('5')); // +5 $this->assertEquals(array(0, 5), Util::parseAnB('+5')); // n $this->assertEquals(array(1, 0), Util::parseAnB('n')); // 2n $this->assertEquals(array(2, 0), Util::parseAnB('2n')); // -234n $this->assertEquals(array(-234, 0), Util::parseAnB('-234n')); // -2n+1 $this->assertEquals(array(-2, 1), Util::parseAnB('-2n+1')); // -2n + 1 $this->assertEquals(array(-2, 1), Util::parseAnB(' -2n + 1 ')); // +2n-1 $this->assertEquals(array(2, -1), Util::parseAnB('2n-1')); $this->assertEquals(array(2, -1), Util::parseAnB('2n - 1')); // -n + 3 $this->assertEquals(array(-1, 3), Util::parseAnB('-n+3')); // Test invalid values $this->assertEquals(array(0, 0), Util::parseAnB('obviously + invalid')); }