helper_plugin_data::_parse_filter PHP Method

_parse_filter() public method

Parse a filter line into an array
public _parse_filter ( $filterline ) : array | boolean
$filterline
return array | boolean - array on success, false on error
    function _parse_filter($filterline)
    {
        //split filterline on comparator
        if (preg_match('/^(.*?)([\\*=<>!~]{1,2})(.*)$/', $filterline, $matches)) {
            $column = $this->_column(trim($matches[1]));
            $com = $matches[2];
            $aliasses = array('<>' => '!=', '=!' => '!=', '~!' => '!~', '==' => '=', '~=' => '~', '=~' => '~');
            if (isset($aliasses[$com])) {
                $com = $aliasses[$com];
            } elseif (!preg_match('/(!?[=~])|([<>]=?)|(\\*~)/', $com)) {
                msg('Failed to parse comparison "' . hsc($com) . '"', -1);
                return false;
            }
            $val = trim($matches[3]);
            if ($com == '~~') {
                $com = 'IN(';
            }
            if (strpos($com, '~') !== false) {
                if ($com === '*~') {
                    $val = '*' . $val . '*';
                    $com = '~';
                }
                $val = str_replace('*', '%', $val);
                if ($com == '!~') {
                    $com = 'NOT LIKE';
                } else {
                    $com = 'LIKE';
                }
            } else {
                // Clean if there are no asterisks I could kill
                $val = $this->_cleanData($val, $column['type']);
            }
            $sqlite = $this->_getDB();
            if (!$sqlite) {
                return false;
            }
            $val = $sqlite->escape_string($val);
            //pre escape
            if ($com == 'IN(') {
                $val = explode(',', $val);
                $val = array_map('trim', $val);
                $val = implode("','", $val);
            }
            return array('key' => $column['key'], 'value' => $val, 'compare' => $com, 'colname' => $column['colname'], 'type' => $column['type']);
        }
        msg('Failed to parse filter "' . hsc($filterline) . '"', -1);
        return false;
    }

Usage Example

Exemplo n.º 1
0
 public function testParseFilter()
 {
     $helper = new helper_plugin_data();
     $this->assertEquals($this->createFilterArray('name', 'tom', '=', 'name_some', 'some'), $helper->_parse_filter('name_some = tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', '=', 'name', ''), $helper->_parse_filter('name = tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', '!=', 'name', ''), $helper->_parse_filter('name != tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', '!=', 'name', ''), $helper->_parse_filter('name <> tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', '<', 'name', ''), $helper->_parse_filter('name < tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', '>', 'name', ''), $helper->_parse_filter('name > tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', '<=', 'name', ''), $helper->_parse_filter('name <= tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', '>=', 'name', ''), $helper->_parse_filter('name >= tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', 'LIKE', 'name', ''), $helper->_parse_filter('name ~ tom'));
     $this->assertEquals($this->createFilterArray('name', '%tom%', 'LIKE', 'name', ''), $helper->_parse_filter('name *~ tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom', 'NOT LIKE', 'name', ''), $helper->_parse_filter('name !~ tom'));
     $this->assertEquals($this->createFilterArray('name', '%tom', 'LIKE', 'name', ''), $helper->_parse_filter('name ~ *tom'));
     $this->assertEquals($this->createFilterArray('name', 'tom%', 'LIKE', 'name', ''), $helper->_parse_filter('name ~ tom*'));
     $this->assertEquals($this->createFilterArray('name', '%tom%', 'LIKE', 'name', ''), $helper->_parse_filter('name ~ *tom*'));
     $this->assertEquals(false, $helper->_parse_filter('name is *tom*'));
     $this->assertEquals(false, $helper->_parse_filter(''));
 }