- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/general/php_parser.php
- Класс: PHPParser
- Вызов: PHPParser::ParseScript
static function ParseScript($scriptContent)
{
$arComponents = array();
$componentNumber = -1;
$bInComponent = false;
$bInPHP = false;
$bInString = false;
$quoteChar = "";
$bSlashed = false;
$string = false;
$instruction = "";
//mb_substr is catastrophic slow, so in UTF we use array of characters
if(defined("BX_UTF"))
$allChars = preg_split('//u', $scriptContent, -1, PREG_SPLIT_NO_EMPTY);
else
$allChars = &$scriptContent;
$scriptContentLength = mb_strlen($scriptContent);
$arAllStr = array();
$ind = -1;
while ($ind < $scriptContentLength - 1)
{
$ind++;
$ch = $allChars[$ind];
if ($bInPHP)
{
if (!$bInString)
{
if (!$bInComponent && $instruction <> '')
{
if (preg_match("#\s*((\$[A-Z_][A-Z0-9_]*\s*=)?\s*\$APPLICATION->IncludeComponent\s*\()#is", $instruction, $arMatches))
{
$arAllStr = array();
$bInComponent = true;
$componentNumber++;
$instruction = $arMatches[1];
$arComponents[$componentNumber] = array(
"START" => ($ind - mb_strlen($arMatches[1])),
"END" => false,
"DATA" => array()
);
}
}
if ($string !== false)
{
if ($bInComponent)
{
$arAllStr[] = $string;
$instruction .= chr(1).(count($arAllStr) - 1).chr(2);
}
$string = false;
}
if ($ch == ";")
{
if ($bInComponent)
{
$bInComponent = false;
$arComponents[$componentNumber]["END"] = $ind + 1;
$arComponents[$componentNumber]["DATA"] = PHPParser::GetComponentParams(preg_replace("#[ rnt]#", "", $instruction), $arAllStr);
}
$instruction = "";
continue;
}
if ($ch == "/" && $ind < $scriptContentLength - 2)
{
$nextChar = $allChars[$ind + 1];
if ($nextChar == "/")
{
$endPos = mb_strpos($scriptContent, "n", $ind + 2);
if ($endPos === false)
$ind = $scriptContentLength - 1;
else
$ind = $endPos;
continue;
}
elseif ($nextChar == "*")
{
$endPos = mb_strpos($scriptContent, "*/", $ind + 2);
if ($endPos === false)
$ind = $scriptContentLength - 1;
else
$ind = $endPos + 1;
continue;
}
}
if ($ch == """ || $ch == "'")
{
$bInString = true;
$string = "";
$quoteChar = $ch;
continue;
}
if ($ch == "?" && $ind < $scriptContentLength - 2 && $allChars[$ind + 1] == ">")
{
$ind += 1;
if ($bInComponent)
{
$bInComponent = false;
$arComponents[$componentNumber]["END"] = $ind - 1;
$arComponents[$componentNumber]["DATA"] = PHPParser::GetComponentParams(preg_replace("#[ rnt]#", "", $instruction), $arAllStr);
}
$instruction = "";
$bInPHP = false;
continue;
}
$instruction .= $ch;
if ($ch == " " || $ch == "r" || $ch == "n" || $ch == "t")
continue;
}
else
{
if ($ch == "\" && !$bSlashed)
{
$bSlashed = true;
continue;
}
if ($ch == $quoteChar && !$bSlashed)
{
$bInString = false;
continue;
}
$bSlashed = false;
$string .= $ch;
}
}
else
{
if ($ch == "<")
{
if ($ind < $scriptContentLength - 5 && $allChars[$ind + 1].$allChars[$ind + 2].$allChars[$ind + 3].$allChars[$ind + 4] == "?php")
{
$bInPHP = true;
$ind += 4;
}
elseif ($ind < $scriptContentLength - 2 && $allChars[$ind + 1] == "?")
{
$bInPHP = true;
$ind += 1;
}
}
}
}
return $arComponents;
}