- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/composite/appcache.php
- Класс: BitrixMainCompositeAppCache
- Вызов: AppCache::getFilesFromContent
public function getFilesFromContent($content)
{
$files = Array();
$arFilesByType = Array();
$arExtensions = Array("js", "css");
$extension_regex = "(?:" . implode("|", $arExtensions) . ")";
$findImageRegexp = "/
((?i:
href=
|src=
|BX\.loadCSS\(
|BX\.loadScript\(
|jsUtils\.loadJSFile\(
|background\s*:\s*url\(
)) #attribute
("|') #open_quote
([^?'"]+\.) #href body
(" . $extension_regex . ") #extentions
(|\?\d+|\?v=\d+) #params
(\2) #close_quote
/x";
$match = Array();
preg_match_all($findImageRegexp, $content, $match);
$link = $match[3];
$extension = $match[4];
$params = $match[5];
$linkCount = count($link);
$fileData = array(
"FULL_FILE_LIST" => array(),
"FILE_TIMESTAMPS" => array(),
"CSS_FILE_IMAGES" => array()
);
for ($i = 0; $i < $linkCount; $i++)
{
$fileData["FULL_FILE_LIST"][] = $files[] = $link[$i] . $extension[$i] . $params[$i];
$fileData["FILE_TIMESTAMPS"][$link[$i] . $extension[$i]] = $params[$i];
$arFilesByType[$extension[$i]][] = $link[$i] . $extension[$i];
}
$manifestCache = $this->readManifestCache($this->getCurrentManifestID());
$excludePatternsHash = md5(serialize($this->excludeImagePatterns));
if (array_key_exists("css", $arFilesByType))
{
$findImageRegexp = '#([;s:]*(?:url|@import)s*(s*)('|"|)(.+?)(2)s*)#si';
if(!empty($this->excludeImagePatterns))
{
$findImageRegexp = '#([;s:]*(?:url|@import)s*(s*)('|"|)((?:(?!'.implode("|",$this->excludeImagePatterns).').)+?)(2)s*)#si';
}
$cssCount = count($arFilesByType["css"]);
for ($j = 0; $j < $cssCount; $j++)
{
$cssFilePath = $arFilesByType["css"][$j];
if ($manifestCache["FILE_DATA"]["FILE_TIMESTAMPS"][$cssFilePath] != $fileData["FILE_TIMESTAMPS"][$cssFilePath]
||$excludePatternsHash != $manifestCache["EXCLUDE_PATTERNS_HASH"]
)
{
$fileContent = false;
$fileUrl = parse_url($cssFilePath);
$file = new BitrixMainIOFile(Application::getDocumentRoot() . $fileUrl['path']);
if($file->getExtension() !== "css")
continue;
if ($file->isExists() && $file->isReadable())
{
$fileContent = $file->getContents();
}
elseif ($fileUrl["scheme"])
{
$req = new CHTTP();
$req->http_timeout = 20;
$fileContent = $req->Get($cssFilePath);
}
if ($fileContent != false)
{
$cssFileRelative = new BitrixMainIOFile($cssFilePath);
$cssPath = $cssFileRelative->getDirectoryName();
preg_match_all($findImageRegexp, $fileContent, $match);
$matchCount = count($match[3]);
for ($k = 0; $k < $matchCount; $k++)
{
$file = self::replaceUrlCSS($match[3][$k], addslashes($cssPath));
if (!in_array($file, $files) && !mb_strpos($file, ";base64"))
{
$fileData["FULL_FILE_LIST"][] = $files[] = $file;
$fileData["CSS_FILE_IMAGES"][$cssFilePath][] = $file;
}
}
}
}
else
{
$fileData["CSS_FILE_IMAGES"][$cssFilePath] = $manifestCache["FILE_DATA"]["CSS_FILE_IMAGES"][$cssFilePath];
if (is_array($manifestCache["FILE_DATA"]["CSS_FILE_IMAGES"][$cssFilePath]))
{
$fileData["FULL_FILE_LIST"] = array_merge($fileData["FULL_FILE_LIST"], $manifestCache["FILE_DATA"]["CSS_FILE_IMAGES"][$cssFilePath]);
}
}
}
}
return $fileData;
}