137748cd8SNickeau<?php 237748cd8SNickeau 337748cd8SNickeau 437748cd8SNickeaunamespace ComboStrap; 5*1fa8c418SNickeauuse Psr\Log\LogLevel; 6*1fa8c418SNickeau 737748cd8SNickeau/** 837748cd8SNickeau * Class Template 937748cd8SNickeau * @package ComboStrap 1037748cd8SNickeau * https://stackoverflow.com/questions/17869964/replacing-string-within-php-file 1137748cd8SNickeau */ 1237748cd8SNickeauclass Template 1337748cd8SNickeau{ 1437748cd8SNickeau 1537748cd8SNickeau const VARIABLE_PREFIX = "$"; 16*1fa8c418SNickeau const VARIABLE_PATTERN_CAPTURE_VARIABLE = "/(\\" . self::VARIABLE_PREFIX . "[\w]*)/im"; 17*1fa8c418SNickeau const VARIABLE_PATTERN_CAPTURE_NAME = "/\\" . self::VARIABLE_PREFIX . "([\w]*)/im"; 18*1fa8c418SNickeau 1937748cd8SNickeau protected $_string; 2037748cd8SNickeau protected $_data = array(); 2137748cd8SNickeau 2237748cd8SNickeau public function __construct($string = null) 2337748cd8SNickeau { 2437748cd8SNickeau $this->_string = $string; 2537748cd8SNickeau } 2637748cd8SNickeau 2737748cd8SNickeau /** 2837748cd8SNickeau * @param $string 2937748cd8SNickeau * @return Template 3037748cd8SNickeau */ 3137748cd8SNickeau public static function create($string) 3237748cd8SNickeau { 3337748cd8SNickeau return new Template($string); 3437748cd8SNickeau } 3537748cd8SNickeau 3637748cd8SNickeau public function set($key, $value) 3737748cd8SNickeau { 3837748cd8SNickeau $this->_data[$key] = $value; 3937748cd8SNickeau return $this; 4037748cd8SNickeau } 4137748cd8SNickeau 42*1fa8c418SNickeau public function render(): string 4337748cd8SNickeau { 4437748cd8SNickeau 45*1fa8c418SNickeau 46*1fa8c418SNickeau $variablePattern = self::VARIABLE_PATTERN_CAPTURE_VARIABLE; 47*1fa8c418SNickeau $splits = preg_split($variablePattern, $this->_string, -1, PREG_SPLIT_DELIM_CAPTURE); 4837748cd8SNickeau $rendered = ""; 4937748cd8SNickeau foreach ($splits as $part) { 50*1fa8c418SNickeau if (substr($part, 0, 1) === self::VARIABLE_PREFIX) { 5137748cd8SNickeau $variable = trim(substr($part, 1)); 52*1fa8c418SNickeau if(isset($this->_data[$variable])) { 5337748cd8SNickeau $value = $this->_data[$variable]; 5437748cd8SNickeau } else { 55*1fa8c418SNickeau LogUtility::msg("The variable ($variable) was not found and have not been replaced"); 56*1fa8c418SNickeau $value = $variable; 57*1fa8c418SNickeau } 58*1fa8c418SNickeau } else { 5937748cd8SNickeau $value = $part; 6037748cd8SNickeau } 6137748cd8SNickeau $rendered .= $value; 6237748cd8SNickeau } 6337748cd8SNickeau return $rendered; 6437748cd8SNickeau 6537748cd8SNickeau } 6637748cd8SNickeau 6737748cd8SNickeau /** 6837748cd8SNickeau * 6937748cd8SNickeau * @return false|string 7037748cd8SNickeau * @deprecated Just for demo, don't use because the input is not validated 7137748cd8SNickeau * 7237748cd8SNickeau */ 7337748cd8SNickeau public function renderViaEval() 7437748cd8SNickeau { 7537748cd8SNickeau extract($this->_data); 7637748cd8SNickeau ob_start(); 7737748cd8SNickeau eval("echo $this->_string ;"); 7837748cd8SNickeau return ob_get_clean(); 7937748cd8SNickeau } 80*1fa8c418SNickeau 81*1fa8c418SNickeau /** 82*1fa8c418SNickeau * @return array - an array of variable name 83*1fa8c418SNickeau */ 84*1fa8c418SNickeau public function getVariablesDetected(): array 85*1fa8c418SNickeau { 86*1fa8c418SNickeau $result = preg_match_all(self::VARIABLE_PATTERN_CAPTURE_NAME, $this->_string, $matches); 87*1fa8c418SNickeau if ($result >= 1) { 88*1fa8c418SNickeau return $matches[1]; 89*1fa8c418SNickeau } else { 90*1fa8c418SNickeau return []; 91*1fa8c418SNickeau } 92*1fa8c418SNickeau 93*1fa8c418SNickeau 94*1fa8c418SNickeau } 9537748cd8SNickeau} 96