Использование $$vars
и $GLOBALS
оба представляют угрозу безопасности.Пользователь должен иметь возможность явно определить список допустимых тегов.
Ниже приведено простейшее однофункциональное общее решение, которое я мог придумать.Я решил использовать двойные скобки в качестве разделителей тегов, но вы можете изменить его достаточно легко.
/**
* replace_tags replaces tags in the source string with data from the vars map.
* The tags are identified by being wrapped in '{{' and '}}' i.e. '{{tag}}'.
* If a tag value is not present in the tags map, it is replaced with an empty
* string
* @param string $string A string containing 1 or more tags wrapped in '{{}}'
* @param array $tags A map of key-value pairs used to replace tags
* @param force_lower if true, converts matching tags in string via strtolower()
* before checking the tags map.
* @return string The resulting string with all tags replaced.
*/
function replace_tags($string, $tags, $force_lower = false)
{
return preg_replace_callback('/\\{\\{([^{}]+)\}\\}/',
function($matches) use ($force_lower, $tags)
{
$key = $force_lower ? strtolower($matches[1]) : $matches[1];
return array_key_exists($key, $tags)
? $tags[$key]
: '';
}
, $string);
}
[edit] Добавлено force_lower
param
[edit] Добавлено force_lower
varв список use
- Спасибо тому, кто начал отклоненное редактирование.