setContent($content); return $self; } /** * @return string */ public function getContent() { return $this->content; } /** * @param string $value */ public function setContent($value) { $this->content = $value; } /** * @param string $after */ public function replaceCustomFunctions($after = '') { $after = strtoupper($after); if (is_numeric(strpos($this->content, '[CUSTOMFUNCTION' . $after . '|'))) { $allowedFunctions = $this->getAllowedFunctions(); $files = $this->getFiles(); foreach ($files as $file) { include_once $file; } $startFunctions = explode('[CUSTOMFUNCTION' . $after . '|', $this->content); $content = $startFunctions[0]; foreach ($startFunctions as $function) { $endFunction = explode('|CUSTOMFUNCTION' . $after . ']', $function); $html = $endFunction[0]; if (!empty($html)) { $Params = $this->getCustomfunctionParams($html); $func = $Params[0]; unset($Params[0]); if (in_array($func, $allowedFunctions)) { $content .= call_user_func_array($func, $Params); } } $content .= $endFunction[1]; } $this->setContent($content); } } public function getFiles() { return glob($this->customFunctionUrl); } /** * @return array */ public function getAllowedFunctions() { $functionName = ''; $allAllowedFunctions = $this->allowedFunctions; $files = $this->getFiles(); foreach ($files as $file) { $filename = $file; $source = fread(fopen($filename, 'r'), filesize($filename)); $tokens = token_get_all($source); foreach ($tokens as $token) { if (is_array($token)) { if ($token[0] == T_FUNCTION) { $ready = true; } elseif ($ready) { if ($token[0] == T_STRING && $functionName == '') { $functionName = $token[1]; } } } elseif ($ready && $token == '{') { $ready = false; $allAllowedFunctions[] = trim($functionName); $functionName = ''; } } } if (file_exists($this->allowedFunctionUrl)) { $ownAllowedFunctionsContent = file_get_contents($this->allowedFunctionUrl); $ownAllowedFunctions = explode(',', $ownAllowedFunctionsContent); foreach ($ownAllowedFunctions as $ownAllowedFunction) { $ownAllowedFunction = trim($ownAllowedFunction); if (!in_array($ownAllowedFunction, $allAllowedFunctions)) { $allAllowedFunctions[] = $ownAllowedFunction; } } } return $allAllowedFunctions; } /** * @param string $val * @return array */ public function getCustomfunctionParams($val) { $Params = array(); $end = false; do { if (strstr($val, '|')) { if ($val[0] == '"') { $delimiter = '"|'; $val = substr($val, 1); } elseif (substr($val, 0, 6) == '"') { $delimiter = '"|'; $val = substr($val, 6); } else { $delimiter = '|'; } list($Params[], $val) = explode($delimiter, $val, 2); } else { $Params[] = $val; $end = true; } } while (!$end); return $Params; } }