在字符串解析方面需要帮助?

时间:2011-06-30 09:52:29

标签: php parsing string

我正在根据用户输入创建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变量以使其适合上述查询?我必须将numbersign$amount变量分开才能在正确位置使用它们。如果标记错误(i.e $amount='$%20'; ),则应将其视为等号(i.e $amount='=20'; )

我应该采取什么方法来解决这个问题?

由于

3 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式将它们分开:

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”,则签名为=且编号为{{ 1}}。

答案 1 :(得分:2)

$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 );
}

答案 2 :(得分:1)

如果用户可以使用值指定运算符,则必须小心。试试:

$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 );