/** * Create the necessary regEx expressions to deal with xxxx / xxxx-yy / xxxx-yy-zz numbers */ private function _constructRegEx() { # Construct RegEx $DBunits = SELF::_decodeUnitsForRegEx(); $blank = "\\s*"; # just whitespace $justSeparator = "-"; # just hyphen $separator = $blank . $justSeparator . $blank; # separator hypen, with or without blanks $mainNumber = "\\d{1,10}"; # 1 to 10 digits for main number $middleNumber = $lastNumber = "\\d{1,4}"; # 1 or four digits for middle and last number $middleLastNumber = "{$middleNumber}(?:{$justSeparator}{$lastNumber})?"; # middle number - possibly with last number $unitlessNumber = "{$mainNumber}(?:{$justSeparator}{$middleLastNumber})?\\b"; # main number - possible with middle and possible with last number $unitlessNumberNumberRange = "{$unitlessNumber}(?:{$justSeparator}{$unitlessNumber})?"; # one number or two numbers with separator in-between $singleRegEx = array(); $combinedRegEx = false; $unitRegEx = array(); if ($DBunits) { $longMiddleShort = array(); $longMiddleShortRange = array(); foreach ($DBunits as $unit) { $unitId = implode("-", $unit); $mainUnit = "{$mainNumber}" . $unit[0]; $middleUnit = "{$middleNumber}" . $unit[1]; $lastUnit = "{$lastNumber}" . $unit[2]; $optionalLastUnit = "(?:{$justSeparator}{$lastUnit})?"; $optionalMiddleUnit = "(?:{$justSeparator}{$middleUnit}{$optionalLastUnit})?"; $unitRegEx[$unitId] = "{$mainUnit}{$optionalMiddleUnit}"; $short = "{$mainUnit}"; $shortMiddle = "{$short}{$justSeparator}{$middleUnit}"; $shortMiddleLong = "{$shortMiddle}{$justSeparator}{$lastUnit}"; $thisLongMiddleShort = array($shortMiddleLong, $shortMiddle, $short); $thisLongMiddleShortRange = array(); foreach ($thisLongMiddleShort as $front) { // ABC|AB|A cross-product ... foreach ($thisLongMiddleShort as $back) { // ... with ABC|AB|A $thisLongMiddleShortRange[] = "{$front}{$separator}{$back}"; } } foreach ($thisLongMiddleShort as $single) { $thisLongMiddleShortRange[] = "{$single}"; } // ABC|AB|A single $longMiddleShort[$unitId] = $thisLongMiddleShort; $longMiddleShortRange[$unitId] = $thisLongMiddleShortRange; } $maxidx = 12; // 9 == ABC|AB|A cross product ABC|AB|A + 3 == ABC|AB|A single for ($i = 0; $i < $maxidx; $i++) { foreach (array_keys($longMiddleShortRange) as $unitID) { $singleRegEx["{$unitID}/{$i}"] = $longMiddleShortRange[$unitID][$i]; } } $combinedRegEx = "(?:" . implode("|", $singleRegEx) . ")"; } #echo "<pre>longMiddleShort\n" . print_r($longMiddleShort,true). "</pre>"; #echo "<pre>longMiddleShortRange\n" . print_r($longMiddleShortRange,true). "</pre>"; #echo "<pre>combinedRegEx\n$combinedRegEx</pre>"; $result = array("justSeparator" => $justSeparator, "separator" => $separator, "blank" => $blank, "mainNumber" => $mainNumber, "middleNumber" => $middleNumber, "lastNumber" => $lastNumber, "middleLastNumber" => $middleLastNumber, "unitlessNumber" => $unitlessNumber, "unitlessNumberNumberRange" => $unitlessNumberNumberRange, "unitRegEx" => $unitRegEx, "singleRegEx" => $singleRegEx, "combinedRegEx" => $combinedRegEx); # echo "<pre>" . print_r($result,true). "</pre>"; # die(); return $result; }
/** * Filter for a measurement after search page submission. * * @param array $args */ public function hookItemsBrowseSql($args) { $select = $args['select']; $params = $args['params']; $regEx = SELF::_constructRegEx(); foreach ($regEx as $key => $val) { ${$key} = $val; } if (isset($params['measurement_search_term']) and preg_match("({$oneOrTwoNumbers})", $params['measurement_search_term'])) { # echo "<pre>" . $params['measurement_search_term'] . " / " . $oneOrTwoNumbers . "</pre>"; $singleCount = preg_match_all("({$oneNumber})", $params['measurement_search_term'], $singleNumbers); # echo "<pre>$singleCount: " . print_r($singleNumbers,true) . "</pre>"; $lower = $singleNumbers[0][0]; $higher = isset($singleNumbers[0][1]) ? $singleNumbers[0][1] : $lower; $lower = str_pad($lower, MEASUREMENTSEARCH_NUM_MAXLEN, "0", STR_PAD_LEFT); $higher = str_pad($higher, MEASUREMENTSEARCH_NUM_MAXLEN, "0", STR_PAD_LEFT); # echo "<pre>$lower / $higher</pre>"; $db = get_db(); $select->join(array('measurement_search_values' => $db->MeasurementSearchValues), "measurement_search_values.item_id = items.id", array())->where("('{$higher}' >= measurement_search_values.height and '{$lower}' <= measurement_search_values.height) or " . "('{$higher}' >= measurement_search_values.width and '{$lower}' <= measurement_search_values.width) or " . "('{$higher}' >= measurement_search_values.depth and '{$lower}' <= measurement_search_values.depth)"); # echo "<pre>$select</pre>"; if (isset($params['measurement_search_unit']) and is_array($params['measurement_search_unit'])) { $measurementSearchFormUnits = array(); foreach ($params['measurement_search_unit'] as $unit) { $measurementSearchFormUnits[] = intval($unit); } if ($measurementSearchFormUnits) { $validUnits = SELF::_decodeUnitsForRegEx(); if ($validUnits) { $MeasurementSearchUnits = array_keys($validUnits); $dbUnits = array(); foreach ($measurementSearchFormUnits as $unit) { if (isset($MeasurementSearchUnits[$unit])) { $dbUnits[] = addslashes($validUnits[$unit]); } } #echo "<pre>" . print_r($dbUnits, true) . "</pre>"; die(); if ($dbUnits) { $dbUnits = "'" . implode("','", $dbUnits) . "'"; $select->where("measurement_search_values.unit in ({$dbUnits})"); } } # if ($validUnits) } # if ($measurementSearchFormUnits) } # if ( (isset($params['measurement_search_unit'])) } # if ( (isset($params['measurement_search_term'])) ... }