• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/web/dom/queryengine.php
  • Класс: BitrixMainWebDOMQueryEngine
  • Вызов: QueryEngine::isNodeFiltered
protected function isNodeFiltered(Node $node, array $filter)
{
	$isFiltered = false;
	foreach($filter as $filterItem)
	{
		foreach($filterItem as $type => $value)
		{
			switch($type)
			{
				case self::FILTER_NODE_TYPE:

					if (!is_array($value))
					{
						$value = array($value);
					}

					foreach($value as $nodeType)
					{
						if(!$node->getNodeType() === $nodeType)
						{
							return false;
						}
						else
						{
							$isFiltered = true;
						}
					}
					break;

				case self::FILTER_NODE_NAME:
					if(mb_strtoupper($value) === $node->getNodeName())
					{
						$isFiltered = true;
					}
					else
					{
						return false;
					}
					break;

				case self::FILTER_ATTR:
					if(!$node->hasAttributes())
					{
						$isFiltered = false;
					}
					else
					{
						if (!is_array($value))
						{
							$value = array($value);
						}

						foreach($value as $attrName)
						{
							/* @var $node Element*/
							if($node->getAttribute($attrName) === null)
							{
								return false;
							}
							else
							{
								$isFiltered = true;
							}
						}
					}
					break;

				case self::FILTER_ATTR_VALUE:
					if(!$node->hasAttributes())
					{
						$isFiltered = false;
					}
					else
					{
						foreach($value as $attr)
						{
							$attrValue = $node->getAttribute($attr['name']);
							if(!$attrValue)
							{
								continue;
							}

							$operationValue = $attr['value'];
							switch($attr['operation'])
							{
								case self::FILTER_OPERATION_NOT_EQUAL:

									if($attrValue === $operationValue)
									{
										return false;
									}
									break;

								case self::FILTER_OPERATION_CONTAIN:

									if(mb_strpos($attrValue, $operationValue) === false)
									{
										return false;
									}
									break;

								case self::FILTER_OPERATION_END:

									if(mb_substr($attrValue, -mb_strlen($operationValue)) !== $operationValue)
									{
										return false;
									}
									break;

								case self::FILTER_OPERATION_START:

									if(mb_strpos($attrValue, $operationValue) !== 0)
									{
										return false;
									}
									break;

								case self::FILTER_OPERATION_CONTAIN_WORD:

									throw new DomException('Not supported query filter: FILTER_OPERATION_CONTAIN_WORD');
									break;

								case self::FILTER_OPERATION_EQUAL:
								default:
									if($attrValue !== $operationValue)
									{
										return false;
									}

							}

							$isFiltered = true;
						}
					}
					break;

				case self::FILTER_ATTR_CLASS_NAME:
					if(!$node->hasAttributes())
					{
						$isFiltered = false;
					}
					else
					{
						if (!is_array($value))
						{
							$value = array($value);
						}

						foreach($value as $className)
						{
							if(!in_array($className, $node->getClassList()))
							{
								return false;
							}
							else
							{
								$isFiltered = true;
							}
						}
					}
					break;
			}
		}
	}

	return $isFiltered;
}