2012-03-06 94 views
0

在JSP中,你可以像这样创建标签:如何在Php中嵌套内容?

<myns:mytag> 
<p>Content</p> 
</myns:mytag> 

并处理mytag执行的内容。在PHP中可以这样吗?

+3

这是否与你使用的模板系统如Smarty,Twig等有关? – James 2012-03-06 13:17:24

+0

不只是我想知道的一个基本问题 – gotch4 2012-03-06 13:29:36

回答

1

如果您在讨论PHP的输出中的嵌套标记,那么答案是肯定的。 PHP不关心你输出的字符串。

0

让我们玩了一会儿,说这是你的XML:

<?xml version="1.0" encoding="utf-8"?> 
<html xmlns:mn="http://example.com"> 
    <head> 
     <mn:title>Foor</mn:title> 
    </head> 

    <body> 
     <div>Navigation</div> 
     <mn:content> 
      Lorem ipsum 
     </mn:content> 
    </body> 
</html> 

它存储在$data,你会与下面的类解析它:

class Parser { 
    // DOMDocument 
    protected $xml; 

    // Handles mn:title 
    protected function actionTitle(DOMNode $node){ 
     $title = $this->xml->createElement('title', 'My dynamic title'); 
     $node->parentNode->replaceChild($title, $node); 
    } 

    // Handles mn:content 
    protected function actionContent(DOMNode $node){ 
     $content = $this->xml->createElement('div', 'Lorem ipsum sit dolor'); 
     $node->parentNode->replaceChild($content, $node); 
    } 

    // Initializes data 
    public function __construct($data){ 
     $this->xml = new DOMDocument(); 
     $this->xml->preserveWhiteSpace = false; 
     $this->xml->loadXML($data); 
     $this->xml->formatOutput = true; 
    } 

    // Browse all elements 
    public function parse() { 
     $list = $this->xml->getElementsByTagNameNS('http://example.com', '*'); 
     while($list->length){ 
      $node = $list->item(0); 
      $tagName = ucfirst(substr($node->nodeName, strpos($node->nodeName, ':') + 1)); 
      echo $tagName . "\n"; // Title, Content 
      $funcName = 'action' . $tagName; 

      $this->$funcName($node); 

      $list = $this->xml->getElementsByTagNameNS('http://example.com', '*'); 
     } 
    } 

    // Get 
    public function get(){ 
     return $this->xml->saveXML(); 
    } 
} 

// And build some output 
$parser = new Parser($data); 
$parser->parse(); 
echo $parser->get(); 

我们正在采取的功能getElementsByTagNameNS()优势,当然这只是一个沉重的例子,你需要更深入地构建它,但至少你会明白这个可能工作:)

0

嗯。评论说基本的PHP,没有模板系统。

你可以在<myns:mytag>上开启输出缓冲,在</myns:mytag>关闭输出缓冲,然后抓取输出并处理它。这有点笨重。 http://php.net/manual/en/book.outcontrol.php

我会看看模板系统(我会建议,一般来说),看看他们有什么提供。