• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/sanitizer.php
  • Класс: CBXSanitizer
  • Вызов: CBXSanitizer::CleanTable
protected function CleanTable(&$seg, &$openTagsStack, $segIndex, $delTextBetweenTags=true)
	{
		//if we found up level or not
		$bFindUp = false;
		//count open & close tags
		$arOpenClose = array();

		for ($tElCategory=self::TABLE_COLS;$tElCategory>self::TABLE_TOP;$tElCategory--)
		{
			if($this->arTableTags[$seg[$segIndex]['tagName']] != $tElCategory)
				continue;

			//find back upper level
			for($j=$segIndex-1;$j>=0;$j--)
			{
				if ($seg[$j]['segType'] != 'tag' || !array_key_exists($seg[$j]['tagName'], $this->arTableTags))
					continue;

				if(isset($seg[$j]['action']) && $seg[$j]['action'] == self::ACTION_DEL)
					continue;

				if($tElCategory == self::TABLE_COLS)
				{
					if($this->arTableTags[$seg[$j]['tagName']] == self::TABLE_COLS || $this->arTableTags[$seg[$j]['tagName']] == self::TABLE_ROWS)
						$bFindUp = true;
				}
				else
					if($this->arTableTags[$seg[$j]['tagName']] <= $tElCategory)
						$bFindUp = true;

				if(!$bFindUp)
					continue;

				//count opened and closed tags
				if (!isset($arOpenClose[$seg[$j]['tagName']][$seg[$j]['tagType']]))
				{
					$arOpenClose[$seg[$j]['tagName']][$seg[$j]['tagType']] = 0;
				}
				$arOpenClose[$seg[$j]['tagName']][$seg[$j]['tagType']]++;

				//if opened tag not found yet, searching for more
				$openCount = $arOpenClose[$seg[$j]['tagName']]['open'] ?? 0;
				$closeCount = $arOpenClose[$seg[$j]['tagName']]['close'] ?? 0;
				if($openCount <= $closeCount)
				{
					$bFindUp = false;
					continue;
				}


				if(!$delTextBetweenTags)
					break;

				//if find up level let's mark all middle text and tags for del-action
				for($k=$segIndex-1;$k>$j;$k--)
				{
					//lt's save text-format
					if($seg[$k]['segType'] == 'text' && !preg_match("#[^nrs]#i".BX_UTF_PCRE_MODIFIER, $seg[$k]['value']))
						continue;

					$seg[$k]['action'] = self::ACTION_DEL;
					if(isset($seg[$k]['closeIndex']))
						unset($openTagsStack[$seg[$k]['closeIndex']]);
				}

				break;

			}
			//if we didn't find up levels,lets mark this block as del
			if(!$bFindUp)
				$seg[$segIndex]['action'] = self::ACTION_DEL;

			break;

		}
		return $bFindUp;
	}