• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/data/appcachemanifest.php
  • Класс: BitrixMainDataAppCacheManifest
  • Вызов: AppCacheManifest::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(count($this->excludeImagePatterns) > 0)
		{
			$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->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) && !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;
}