PHP is replcing The < & > in a php statement with HTML comments

╄→尐↘猪︶ㄣ 提交于 2020-06-29 03:52:19

问题


I am currently trying to create a small template engine for a project that I am working on, and I am using a system where I am replacing {$tag} with a preset tag. So say I put {username} in my template file, it will return a string which is the username. Now I want to go beyond just a simple string replacing a string. So using the same code I put

$tpl->replace('getID', '<?php echo "test"; ?>);

And it didn't work, so when I went to inspect element, I saw that it returned <!--? echo "test"; ?-->...

So now I am just trying to figure out why it returned commented code.

Here is my class file:

class template {

    private $tags = [];

    private $template;

    public function getFile($file) {

        if (file_exists($file)) {

            $file = file_get_contents($file);
            return $file;

        } else {

            return false;

        }
    }

        public function __construct($templateFile) {

            $this->template = $this->getFile($templateFile);

            if (!$this->template) {

                return "Error! Can't load the template file $templateFile"; 

            }

        }

        public function set($tag, $value) {

            $this->tags[$tag] = $value;
        }

        private function replaceTags() {

            foreach ($this->tags as $tag => $value) {
                $this->template = str_replace('{'.$tag.'}', $value, $this->template);
            }
        return true;
        }

        public function render() {
            $this->replaceTags();
            print($this->template);
        }

}

And My index file is:

require_once 'system/class.template.php';

$tpl = new template('templates/default/main.php');

$tpl->set('username', 'Alexander');
$tpl->set('location', 'Toronto');
$tpl->set('day', 'Today');

$tpl->set('getID', '<?php echo "test"; ?>');

$tpl->render();

And my template file is:

<!DOCTYPE html>

<html>

<head></head>

<body>
    {getID}
  <div>
    <span>User Name: {username}</span>
    <span>Location: {location}</span>
    <span>Day: {day}</span>
  </div>
</body>
</html>


回答1:


You're redeclaring PHP in a php file when there is no need to. i.e. you're trying to print <?php which is why it's messing up.

So, you can replace this:

$tpl->set('getID', '<?php echo "test"; ?>');

with this

$tpl->set('getID', 'test');

But, you obviously already know that, you're just trying to go further, the way to do this is by using php inside the set. So, as an idea, you could try this:

$tpl->set('getID', testfunction());

(You're calling testfunction here to define the 'getID' here btw)

So, now you want to write a little function to do something fancy, for the sake of this example:

function testfunction(){
  $a = 'hello';
  $b = 'world';
  $c = $a . ' ' . $b;
  return $c;
}

The above should then return hello world in place of {getID}

In reference to your comments - if you want to go one step further and start being more advanced with the return results, you can do the following:

function testfunction(){
  $content = "";
  foreach ($a as $b){
    ob_start();
  ?>
    <span><?php echo $b->something; ?></span>
    <a href="#">Some link</a>
    <div>Some other html</div>
    <?php 
      $content += ob_get_clean();
  }
  return $content
}


来源:https://stackoverflow.com/questions/62315836/php-is-replcing-the-in-a-php-statement-with-html-comments

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!