Нужна помощь в разборе строк? - PullRequest
1 голос
/ 30 июня 2011

Я создаю SQL-запрос на основе ввода пользователя:

// user input
$amount = '20';

// query in zend 
$select->where('amount = ?', $amount );

Теперь в соответствии с новыми требованиями пользователь может вводить также в следующих форматах:

$amount = '20';
$amount = '<20';
$amount = '<=20';
$amount = '>20';
$amount = '>=20';
$amount = '=20';

Я думаю, вы понимаете новую функцию. Итак, как мне разобрать переменную $amount, чтобы она соответствовала приведенному выше запросу? Я должен отделить number и sign от переменной $amount, чтобы использовать их в правильном положении. И если есть неправильный знак (i.e $amount='$%20'; ), то он должен рассматривать его как знак равенства (i.e $amount='=20'; )

Какой подход я должен использовать, чтобы решить эту проблему?

Спасибо

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

Вы можете использовать следующее регулярное выражение для их разделения:

preg_match('/(<|>|=|<=|>=)([0-9]+)/', $amount, $matches);
$sign=$matches[1];
$number=$matches[2];

ОБНОВЛЕНИЕ: Я проверил это и обнаружил, что он не обрабатывает ошибочные знаки должным образом.Я придумал следующий код, который, кажется, работает нормально:

$amount=">=20";
preg_match('/([^0-9]*)([0-9]+)/', $amount, $matches);
$sign=preg_match('/^(>|<|=|<=|>=)$/', $matches[1]) ? $matches[1] : '=';
$number=$matches[2];

Если указана строка >=20, то знак >= и число '20', если заданная строка '%$ 20 ', тогда знак - =, а номер - 20.

2 голосов
/ 30 июня 2011
$parts = array();
if (preg_match('/^(\D+)?(\d+)$/', $amount, $parts)) {
    $operator = (!in_array($parts[1], array('=', '<', '<=', '>=', '>'))) ? '=' : $parts[1];
    $value    = $parts[2];
    $select->where('amount ' . $operator . ' ?', $value );
}
1 голос
/ 30 июня 2011

Если пользователь может указать оператор со значением, вы должны быть осторожны. Попробуйте с:

$input = '<=20';
$allowedOperators = array('<', '<=', '>', '>=', '=');

if ( in_array(substr($input,0,2), $allowedOperators) ) {
    $operator = substr($input,0,2);
} else if ( in_array(substr($input,0,1), $allowedOperators) ) {
    $operator = substr($input,0,1);
} else {
    $operator = '=';
}

$amount = (int) substr($input, strlen($operator));

$select->where('amount ' . $operator . ' ?', $amount );
...