protected function match_attributes($attributes)
{
$res = false;
foreach ($attributes as $attribute => $match) {
if (!is_array($match)) {
$match = array('operator_value' => 'equals', 'value' => $match, 'match' => true, 'operator_result' => 'or', 'compare' => 'total', 'case_sensitive' => false);
} else {
if (is_int($attribute)) {
$attribute = $match['attribute'];
}
if (!isset($match['match'])) {
$match['match'] = true;
}
if (!isset($match['operator_result'])) {
$match['operator_result'] = 'or';
}
if (!isset($match['compare'])) {
$match['compare'] = 'total';
}
if (!isset($match['case_sensitive'])) {
$match['case_sensitive'] = false;
}
}
if (is_string($match['value']) && !$match['case_sensitive']) {
$match['value'] = strtolower($match['value']);
}
if ($match['operator_result'] === 'and' && !$res) {
return false;
} elseif (!($res && $match['operator_result'] === 'or')) {
$possibles = $this->findAttribute($attribute, $match['compare'], $match['case_sensitive']);
$has = is_array($possibles) && $possibles;
$res = $match['value'] === $has || $match['match'] === false && $has === $match['match'];
if (!$res && $has && is_string($match['value'])) {
foreach ($possibles as $a) {
$val = $this->attributes[$a[2]];
if (is_string($val) && !$match['case_sensitive']) {
$val = strtolower($val);
}
switch ($match['operator_value']) {
case '%=':
case 'contains_regex':
$res = preg_match('`' . $match['value'] . '`s', $val) > 0 === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '|=':
case 'contains_prefix':
$res = preg_match('`\\b' . preg_quote($match['value']) . '[\\-\\s]`s', $val) > 0 === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '~=':
case 'contains_word':
$res = preg_match('`\\s' . preg_quote($match['value']) . '\\s`s', " {$val} ") > 0 === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '*=':
case 'contains':
$res = (strpos($val, $match['value']) !== false) === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '$=':
case 'ends_with':
$res = (substr($val, -strlen($match['value'])) === $match['value']) === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '^=':
case 'starts_with':
$res = (substr($val, 0, strlen($match['value'])) === $match['value']) === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '!=':
case 'not_equal':
$res = ($val !== $match['value']) === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '=':
case 'equals':
$res = ($val === $match['value']) === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '>=':
case 'bigger_than':
$res = $val >= $match['value'] === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
case '<=':
case 'smaller_than':
$res = $val >= $match['value'] === $match['match'];
if ($res) {
break 1;
} else {
break 2;
}
default:
trigger_error('Unknown operator "' . $match['operator_value'] . '" to match attributes!');
return false;
}
}
}
}
}
return $res;
}