...Человеческий поиск в разработке...
- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_url_util.php
- Класс: \CCrmUrlTemplate
- Вызов: CCrmUrlTemplate::Prepare
private function Prepare() { if($this->isReady) { return; } $this->nodes = array(); $this->template = preg_replace('/[\r\n]/', '', $this->template); $result = preg_match_all('/\[\s*\/?\s*[a-z0-9_]+\s*\/?\s*\]/i'.BX_UTF_PCRE_MODIFIER, $this->template, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE ); if(!(is_int($result) && $result > 0)) { return; } $curNode = null; $lastNode = null; $offset = 0; foreach($matches as &$match) { $m = &$match[0]; if(!(is_array($m) && count($m) === 2)) { continue; } $tag = $m[0]; $tagLength = mb_strlen($tag); $tagName = trim(mb_substr($tag, 1, $tagLength - 2)); $slashPos = mb_strpos($tagName, '/'); $isEnd = $slashPos === 0; $isSelfClosing = $slashPos === mb_strlen($tagName) - 1; if($isEnd) { $tagName = trim(mb_substr($tagName, 1)); } elseif($isSelfClosing) { $tagName = trim(mb_substr($tagName, 0, mb_strlen($tagName) - 1)); } if(!$isSelfClosing && !self::IsChildNodesSupported($tagName)) { $isSelfClosing = true; } $node = array( 'nodeType' => 1, //object 'name' => mb_strtoupper($tagName), 'offset' => intval($m[1]), 'length' => $tagLength, 'isEnd' => $isEnd, 'isSelfClosing' => $isSelfClosing, 'parent' => null, 'nodes' => array(), 'end' => null ); $lastNode = &$node; if($node['offset'] > $offset) { $textNode = array( 'nodeType' => 2, //text 'content' => mb_substr($this->template, $offset, $node['offset'] - $offset) ); if($curNode) { $curNode['nodes'][] = &$textNode; $textNode['parent'] = &$curNode; } else { $this->nodes[] = &$textNode; } } $offset = $node['offset'] + $node['length']; if(!$isEnd) { if($curNode) { $curNode['nodes'][] = &$node; $node['parent'] = &$curNode; } else { $this->nodes[] = &$node; } if(!$isSelfClosing) { unset($curNode); $curNode = &$node; } } else { //End tags without opened tag will be ignored. $parent = &$curNode; while($parent) { if($parent['name'] === $node['name']) { $parent['end'] = &$node; $node['parent'] = &$parent; break; } $parent = &$parent['parent']; } unset($parent); } unset($node, $textNode); } unset($match, $m, $curNode); if($lastNode) { $endPos = $lastNode['offset'] + $lastNode['length']; if($endPos < (mb_strlen($this->template) - 1)) { $this->nodes[] = array( 'nodeType' => 2, //text 'content' => mb_substr($this->template, $endPos) ); } } unset($lastNode); $this->isReady = true; }