Php 如何避免DOM解析添加html doctype,<;头>;及<;车身>;标签?
我用这段代码来解析字符串。此函数返回字符串时,会添加一些标记:Php 如何避免DOM解析添加html doctype,<;头>;及<;车身>;标签?,php,parsing,dom,Php,Parsing,Dom,我用这段代码来解析字符串。此函数返回字符串时,会添加一些标记: <? $string = ' Some photos<br> <span class="naslov_slike">photo_by_ile_IMG_1676-01</span><br /> <span class="naslov_slike">photo_by_ile_IMG_1699-01</span><br /&
<?
$string = '
Some photos<br>
<span class="naslov_slike">photo_by_ile_IMG_1676-01</span><br />
<span class="naslov_slike">photo_by_ile_IMG_1699-01</span><br />
<span class="naslov_slike">photo_by_ile_IMG_1697-01</span><br />
<span class="naslov_slike">photo_by_ile_IMG_1695-01</span><br />
';
$dom = new DOMDocument();
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;
$elements = $dom->getElementsByTagName('span');
$spans = array();
foreach($elements as $span) {
$spans[] = $span;
}
foreach($spans as $span) {
$span->parentNode->removeChild($span);
}
echo $dom->saveHTML();
?>
一些照片
有没有办法避免这种情况并返回干净的字符串?这个输入字符串只是一个例子,在使用中它可以是任何html字符串。我不确定这两个字符串中的任何一个是否真的可以工作,但您可以尝试在构建
DOMDocument
时使用它-第三个参数是您希望使用的DOCTYPE
另外,您可以尝试使用正则表达式来去除第一位,而不是
saveHTML()
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Some photos<br><br><br><br><br></p></body></html>
echo preg_replace(“/]+>/”,“”,$dom->saveHTML());
我实际上在寻找相同的解决方案。我一直在使用以下方法来执行此操作,但是在执行loadHTML()
时,文本节点周围的
仍将添加。我不知道有没有一种不用另一个解析器就可以绕过它的方法,或者有一个隐藏的标志告诉它不要这样做
此代码:
echo preg_replace("/<!DOCTYPE [^>]+>/", "", $dom->saveHTML());
使用loadHTML后,您可以执行以下操作:
<p>Some photos<br><br><br><br><br></p>
$html_fragment = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveHTML()));
#加载HTML会导致错误!要添加的DOCTYPE标记,请将其删除:
$dom->removeChild($dom->firstChild);
#它还将代码封装在中,以便删除:
$dom->replaceChild($dom->firstChild->firstChild->firstChild,$dom->firstChild);
!DOCTYPE
标记将被删除,而正文
标记中的第一个标记将替换html
标记
显然,只有当您只对正文
中的第一个标记感兴趣时,这才有效,就像我遇到这个问题时一样。但是这个例子可以被改编成只需一点点努力就可以复制正文中的所有内容
编辑:嗯,没关系。我喜欢meder的解决方案。手册:
$html\u fragment=preg\u replace('/^/','',str\u replace(数组('','',''),数组('','',''),$dom->saveHTML());
适合我。嘿,为什么不回答一个9岁的问题呢?PHP 5.4版(在提出此问题3年后发布)在DomDocument::loadHTML()
中添加了options
参数。使用它,您可以执行以下操作:
<p>Some photos<br><br><br><br><br></p>
$html_fragment = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveHTML()));
我们传递两个常量:LIBXML\u HTML\u NODEFDTD
表示不添加文档类型定义,LIBXML\u HTML\u noimpled
表示不添加隐含元素,如
和
您可以添加输入、输出和正在使用的代码吗?我知道你有一个到最后一个的链接,但是在那个特定的页面上有两段不同的代码。可能是重复的geez,很抱歉试图提供帮助,但是我没有时间设置测试并重新创建我试图回答的每个问题所描述的情况。如果它对你如此重要,为什么不在投票前亲自测试一下这些方法呢?嘿,孩子们,该睡觉了:))哥们,如果你有时间键入答案,你最好用代码、或(如果可行的话)在这里复制/粘贴……嗯。。好像我当时穿了我那条古怪的裤子,嘿。总之,@Potherca,这是一个PHP问题,不是Javascript问题。@nickf我的错,一定是打开了太多选项卡。这一点仍然存在,URL应该读(或者我最喜欢的,在本地主机上运行)。:-)这可能会解决问题,但使用DOM解析没有意义。。。我一开始使用它是为了避免正则表达式。虽然,我想我会被迫使用它。感谢您的回答。通常,您希望避免在xml/html中使用正则表达式,因为标记语法非常松散,编写一个将所有这些都考虑在内的正则表达式非常困难。然而,在本例中,您有一个非常明确的结构和已知的输出,因此很容易使用它。如果“HTML+REGEX==BAD!!”没有意义,不要盲目地跟随它。这是一个非常接近而且很好的解决方案。我尝试使用trim函数从字符串的末尾和开头删除和,但它总是只删除第一个,开始标记,结束标记无法删除。。。感谢您的评论,我希望有人能找到删除“p”标记的解决方案$outputHtml=innerHTML($dom->documentElement->firstChild);if(strpos($html,“”)==false){$outputHtml=str_replace(数组(“”,“”),“$outputHtml);}返回$outputHtml;谢谢这应该是可以接受的答案。救了我一天!让我们希望人们对公认的答案有足够的怀疑,从而看到正确的解决方案。。
$dom = new DomDocument();
$dom->loadHTML($string, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
// do stuff
echo $dom->saveHTML();