2013-05-27 29 views
0

他我有此功能的ID设置属性:设置PHP DOM不正确的HTML时<html>,<head>,<body>标签未设置

function set_atr($id, $attribute, $value, $source){ 

    $dom = new DomDocument(); 

    $dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=utf-8">'.$source); 

    $xp = new DOMXPath($dom); 
    $element = $xp->query('//*[@id="'.$id.'"]')->item(0); 

    if(!$element){ 
     return false; 
    } 
    else{ 
     $element->setAttribute($attribute, $value); 
     return str_replace('<meta http-equiv="content-type" content="text/html; charset=utf-8">', '', $dom->saveHTML($dom->documentElement)); 
    } 
} 

当我不使用这个编辑整个文件只是它的一个凶:

<table> 
    <tr> 
      <td><h4>login</h4></td> 
      <td></td> 
    </tr> 
    <tr> 
     <td>username:</td> 
     <td>password:</td> 
    </tr> 
    <tr> 
     <td><input id="username" type="text" placeholder="pipo" name="username" class="form" /></td> 
     <td><input id="password" type="password" placeholder="wachtwoord" name="password" class="form" /></td> 
    </tr> 
    <tr> 
     <td id="error1"></td> 
     <td id="error2"></td> 
    </tr> 
    <tr> 
     <td><input type="button" value="Login" class="btn" action="url" level="cms_user_login" form="login" /></td> 
     <td></td> 
    </tr> 
</table> 

它假设该文件的其余部分被遗漏,并增加了额外的HTML标签是这样的:

<html> 
<head></head> 
<body> <table> 
    <tr> 
      <td><h4>login</h4></td> 
      <td></td> 
    </tr> 
    <tr> 
     <td>username:</td> 
     <td>password:</td> 
    </tr> 
    <tr> 
     <td><input id="username" type="text" placeholder="pipo" name="username" class="form" /></td> 
     <td><input id="password" type="password" placeholder="wachtwoord" name="password" class="form" /></td> 
    </tr> 
    <tr> 
     <td id="error1"></td> 
     <td id="error2"></td> 
    </tr> 
    <tr> 
     <td><input type="button" value="Login" class="btn" action="url" level="cms_user_login" form="login" /></td> 
     <td></td> 
    </tr> 
</table></body> 
</html> 

它并不直接伤害,但它看起来很丑。我以这种方式使用它的原因是因为我使用了很多Ajax,并且只发送了html的代码片段而不是整个文档。

因此,任何人都知道如何让DOM停止这样做?或者这是不可能的。我也可以使用str_replace删除它们,当我使用我的功能,但我认为这是一个丑陋的修复。

+0

看看这个问题它会有所帮助:http://stackoverflow.com/questions/4879946/domdocument-savehtml-without-html-wrapper –

+0

啊是的,它看起来很有趣 – botenvouwer

回答

2

添加<meta>标记将触发DOMDocument的修复行为。好的一点是你根本不需要添加标签。如果您不想使用您选择的编码,只需将其作为构造函数参数传递即可。

http://php.net/manual/en/domdocument.construct.php

$doc = new DOMDocument('1.0', 'UTF-8'); 
$node = $doc->createElement('div', 'Hello World'); 
$doc->appendChild($node); 
echo $doc->saveHTML(); 

输出

<div>Hello World</div> 
+0

伟大的,像一个魅力的作品! – botenvouwer

0

如果您使用xml库[Libxml> = 2.7.7(如PHP> = 5.4.0)的调用loadHTMLLIBXML_HTML_NOIMPLIED作为第二个参数。例如。

$dom->loadHTML($source, LIBXML_HTML_NOIMPLIED); 

这将打压此外隐含<html><body>元素。

另请参阅this答案。