- Модуль: 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;
}