Source
<?php
/*
** Copyright (C) 2001-2025 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/
class CValidationRule {
const STATE_BEGIN = 0;
const STATE_END = 1;
/**
* An error message if validation rule is not valid.
*
* @var string
*/
private $error = '';
/**
* Parse validation rule. Returns array of rules or fail if $buffer is not valid.
*
* @param string $buffer
*
* @return array|bool
*/
public function parse($buffer) {
$this->error = '';
$pos = 0;
$state = self::STATE_BEGIN;
$rules = [];
while (isset($buffer[$pos])) {
switch ($state) {
case self::STATE_BEGIN:
switch ($buffer[$pos]) {
case ' ':
$pos++;
break;
default:
$rule = [];
if (!$this->parseString($buffer, $pos, $rule)
&& !$this->parseRangeTime($buffer, $pos, $rule)
&& !$this->parseAbsDate($buffer, $pos, $rule)
&& !$this->parseAbsTime($buffer, $pos, $rule)
&& !$this->parseTimePeriods($buffer, $pos, $rule)
&& !$this->parseTimeUnit($buffer, $pos, $rule)
&& !$this->parseRgb($buffer, $pos, $rule)
&& !$this->parseRequired($buffer, $pos, $rule)
&& !$this->parseNotEmpty($buffer, $pos, $rule)
&& !$this->parseLE($buffer, $pos, $rule)
&& !$this->parseJson($buffer, $pos, $rule)
&& !$this->parseInt32($buffer, $pos, $rule)
&& !$this->parseUInt64($buffer, $pos, $rule)
&& !$this->parseIn($buffer, $pos, $rule)
&& !$this->parseId($buffer, $pos, $rule)
&& !$this->parseGE($buffer, $pos, $rule)
&& !$this->parseFatal($buffer, $pos, $rule)
&& !$this->parseDB($buffer, $pos, $rule)
&& !$this->parseArrayId($buffer, $pos, $rule)
&& !$this->parseArrayDB($buffer, $pos, $rule)
&& !$this->parseArray($buffer, $pos, $rule)
&& !$this->parseFlags($buffer, $pos, $rule)
&& !$this->parseBool($buffer, $pos, $rule)
&& !$this->parseCuid($buffer, $pos, $rule)) {
// incorrect validation rule
break 3;
}
if (array_key_exists(key($rule), $rules)) {
// the message can be not translated because it is an internal error
$this->error = 'Validation rule "'.key($rule).'" already exists.';
return false;
}
$rules = array_merge($rules, $rule);
$state = self::STATE_END;
break;
}
break;