• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/mail/internal/eventmessage.php
  • Класс: BitrixMainMailInternalEventMessageTable
  • Вызов: EventMessageTable::replaceTemplateToPhp
static function replaceTemplateToPhp($str, $fromTemplateToPhp=true)
{
	preg_match_all("/#([0-9a-zA-Z_.]+?)#/", $str, $matchesFindPlaceHolders);
	$matchesFindPlaceHoldersCount = count($matchesFindPlaceHolders[1]);
	for($i=0; $i<$matchesFindPlaceHoldersCount; $i++)
		if(mb_strlen($matchesFindPlaceHolders[1][$i]) > 200)
			unset($matchesFindPlaceHolders[1][$i]);

	if(empty($matchesFindPlaceHolders[1]))
		return $str;
	$ar = $matchesFindPlaceHolders[1];

	$strResult = $str;
	$arReplaceTagsOne = array();

	if(!$fromTemplateToPhp)
	{
		foreach($ar as $k)
		{
			$replaceTo = '#'.$k.'#';

			$replaceFrom = '$arParams["'.$k.'"]';
			$replaceFromQuote = '$arParams[''.$k.'']';
			$replaceFromPhp = '';

			$arReplaceTagsOne[$replaceFromPhp] = $replaceTo;
			$arReplaceTagsOne[$replaceFrom] = $replaceTo;
			$arReplaceTagsOne[$replaceFromQuote] = $replaceTo;
		}
	}
	else
	{
		$replaceTemplateString = '';
		foreach($ar as $k) $replaceTemplateString .= '|#'.$k.'#';

		$arReplaceTags = array();
		$bOpenPhpTag = false;
		preg_match_all('/('.$replaceTemplateString.')/', $str, $matchesTag, PREG_OFFSET_CAPTURE);
		foreach($matchesTag[0] as $tag)
		{
			$placeHolder = $tag[0];
			$placeHolderPosition = $tag[1];
			$ch1 = mb_substr($placeHolder, 0, 1);
			$ch2 = mb_substr($placeHolder, 0, 2);

			if($ch2 == "")
				$bOpenPhpTag = false;
			elseif($ch1 == "#")
			{
				$placeHolderClear = mb_substr($placeHolder, 1, mb_strlen($placeHolder) - 2);

				$bOpenQuote = (mb_substr($str, $placeHolderPosition - 2, 2) == '"{');
				$bCloseQuote = (mb_substr($str, $placeHolderPosition + mb_strlen($placeHolder), 2) == '}"');
				if($bOpenPhpTag && $bOpenQuote && $bCloseQuote)
					$replaceTo = '$arParams[''.$placeHolderClear.'']';
				else
					$replaceTo = '$arParams["'.$placeHolderClear.'"]';

				if(!$bOpenPhpTag) $replaceTo = '';
				$arReplaceTags[$tag[0]][] = $replaceTo;
			}
		}

		foreach($arReplaceTags as $k => $v)
		{
			if(count($v)>1)
			{
				foreach($v as $replaceTo)
				{
					$resultReplace = preg_replace('/'.$k.'/', $replaceTo, $strResult, 1);
					if($resultReplace !== null)
						$strResult = $resultReplace;
				}
			}
			else
			{
				$arReplaceTagsOne[$k] = $v[0];
			}
		}
	}

	if(!empty($arReplaceTagsOne))
		$strResult = str_replace(array_keys($arReplaceTagsOne), array_values($arReplaceTagsOne), $strResult);

	// php parser delete newline folowing the closing tag in string passed to eval
	$strResult = str_replace(array("?>n", "?>rn"), array("?>nn", "?>rnrn"), $strResult);

	return $strResult;
}