2012-01-17 46 views
8

我一直試圖通過使用HTML DomObject解析網頁,以便使用它們爲應用程序掃描SEO質量。如何防止PHP DomDocument「修復」您的HTML字符串

但是我遇到了一個問題的問題。出於測試目的,我寫了一個小的html頁面包含以下不正確的HTML:

<head> 
<meta name="description" content="randomdesciption"> 
</head> 
<title>sometitle</title> 

正如你可以看到標題是外head標籤至極是我試圖檢測錯誤。

現在問題出現了,當我使用curl從該頁面捕獲響應字符串,然後將其發送到dom文檔以將其加載爲HTML時,它實際上通過在標題周圍添加了另一個標籤來修復此問題。

<head> 
<meta name="description" content="randomdesciption"> 
</head> 
<head><title>sometitle</title></head> 

我已經檢查了捲曲性反應的數據和INFACT是沒有問題的,不知何故loadHTML的執行()方法固定HTML語法中的PHP的DomDocument。

我也嘗試關閉DomDocument恢復,substituteEntities和validateOnParse屬性設置爲false,沒有成功。

我一直在尋找谷歌,但我無法找到任何答案,迄今。我想對於一些實際上希望破解的HTML沒有被修復的人來說,這是非常罕見的。

任何人都知道如何防止DomDocument修復我的壞HTML?

在此先感謝

+0

你有沒有考慮傳遞之前,通過[整齊](http://php.net/tidy)上運行您的標記到DOM,甚至代替DOM?這是檢測標記錯誤的有用擴展。 – TML 2012-01-17 16:26:23

+0

注意:這種行爲實際上與HTML中指定的一樣:''有一個可選的開始和結束標記,並且暗示存在像''這樣的僅頭部元素,這意味着頭部外部的'<title>'將被解析爲在其'<head>'元素內,省略了其開始標記。一旦讀入內存,DOM不會保留源中存在哪些可選標記,因爲它不是文檔語義的一部分,因此它們始終以當前輸出形式輸出。使用HTML_PARSE_NO_IMPLIED可能會對解釋某些有效的HTML文檔的方式產生副作用。 – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/53212/">thomasrutter</a></span> <span>2017-12-20 03:37:45</span> </small> </span> </p> </div> </div> </div> </div> </div> </article> </div> <div class="answer-title"> <span class="text-logo margin-top-sm">A</span> <h2 class="title h4">回答</h2> </div> <div class="item-description text-md markdown-body margin-bottom-40 voidso"> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">7<i class="fa fa-thumbs-up"></i></span> <i class="fa fa-check fa-2x"></i> </div> <div class="post-offset"> <div class="answer fmt"> <p>更新:由於PHP 5.4,你可以用<a href="http://php.net/manual/en/libxml.constants.php#constant.libxml-html-noimplied" rel="nofollow noreferrer"><code class="prettyprint-override">HTML_PARSE_NO_IMPLIED</code></a></p> <pre><code class="prettyprint-override">$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED); </code></pre> <hr> <p><em>下面</em></p> <p>原來的答覆你不能。在理論上<a href="http://xmlsoft.org/html/libxml-HTMLparser.html" rel="nofollow noreferrer">there is a flag <code class="prettyprint-override">HTML_PARSE_NO_IMPLIED</code> for that in libxml</a>,以防止添加隱含的標記,但它不能從PHP訪問。</p> <p>在旁註中,這種特殊行爲似乎取決於所使用的<code class="prettyprint-override">LIBXML_VERSION</code>。</p> <p>運行這段代碼:</p> <pre><code class="prettyprint-override"><?php $html = <<< HTML <head> <meta name="description" content="randomdesciption"> </head> <title>sometitle</title> HTML; $dom = new DOMDocument; $dom->loadHTML($html); $dom->formatOutput = true; echo $dom->saveHTML(), LIBXML_VERSION; </code></pre> <p>我的機器上會給</p> <pre><code class="prettyprint-override"><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html> <head><meta name="description" content="randomdesciption"></head> <title>sometitle</title> </html> 20707 </code></pre> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/8893537">來源</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2012-01-17 11:06:13</span> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/208809/">Gordon</a></span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> <!-- comments --> <div class="comments"> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+1</span></div> <div class="col-lg-11"> <p class="commenttext">這不是我所希望的,但至少我可以停止尋找那些根本不存在的東西。感謝您的幫助,它提供了最豐富的信息。 – <span class="text-secondary"> <small> <span>2012-01-17 15:56:33</span> </small> </span> </p> </div> </div> </div> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+5</span></div> <div class="col-lg-11"> <p class="commenttext">現在可以在PHP v5.4 +中使用[loadhtml](http://php.net/manual/en/domdocument.loadhtml.php)方法的第二個參數'options'。 – <span class="text-secondary"> <small> <span>2014-12-03 22:28:59</span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1038284119" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="clearfix"> </div> <div class="relative-box"> <div class="relative">相關問題</div> <ul class="relative_list"> <li> 1. <a href="http://hk.uwenku.com/question/p-kykwerlp-vz.html" target="_blank" title="如何防止剃刀修改Html字符串"> 如何防止剃刀修改Html字符串 </a> </li> <li> 2. <a href="http://hk.uwenku.com/question/p-yrrwnbos-th.html" target="_blank" title="如何防止Php的DOMDocument對html實體進行編碼?"> 如何防止Php的DOMDocument對html實體進行編碼? </a> </li> <li> 3. <a href="http://hk.uwenku.com/question/p-fenmumti-vm.html" target="_blank" title="操縱PHP domdocument字符串"> 操縱PHP domdocument字符串 </a> </li> <li> 4. <a href="http://hk.uwenku.com/question/p-kocwpjiq-rc.html" target="_blank" title="防止字符串上的Html編碼"> 防止字符串上的Html編碼 </a> </li> <li> 5. <a href="http://hk.uwenku.com/question/p-ceyhaslq-dg.html" target="_blank" title="如何防止PHP字符串在1997字符後截斷"> 如何防止PHP字符串在1997字符後截斷 </a> </li> <li> 6. <a href="http://hk.uwenku.com/question/p-srtslwbf-bcb.html" target="_blank" title="刪除回車字符從PHP tidy修復html字符串"> 刪除回車字符從PHP tidy修復html字符串 </a> </li> <li> 7. <a href="http://hk.uwenku.com/question/p-cybdwrfa-bhv.html" target="_blank" title="PHP RegEx防止重複字符"> PHP RegEx防止重複字符 </a> </li> <li> 8. <a href="http://hk.uwenku.com/question/p-yebazigy-qo.html" target="_blank" title="防止對URL字符串在PHP"> 防止對URL字符串在PHP </a> </li> <li> 9. <a href="http://hk.uwenku.com/question/p-bueabctd-bao.html" target="_blank" title="如何將UTF8字符串傳遞到您的PHP HTML API?"> 如何將UTF8字符串傳遞到您的PHP HTML API? </a> </li> <li> 10. <a href="http://hk.uwenku.com/question/p-dqxvfeyq-bne.html" target="_blank" title="如何防止字符串被攔截"> 如何防止字符串被攔截 </a> </li> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-6208739752673518" data-ad-slot="4606349252"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <li> 11. <a href="http://hk.uwenku.com/question/p-xvncdqrk-bg.html" target="_blank" title="如何防止JAXB轉義字符串"> 如何防止JAXB轉義字符串 </a> </li> <li> 12. <a href="http://hk.uwenku.com/question/p-wzbdgbsn-yg.html" target="_blank" title="PHP的DOMDocument更換一個DOMElement孩子HTML字符串"> PHP的DOMDocument更換一個DOMElement孩子HTML字符串 </a> </li> <li> 13. <a href="http://hk.uwenku.com/question/p-pdwreaqi-cy.html" target="_blank" title="如何修復未終止的字符串常量?"> 如何修復未終止的字符串常量? </a> </li> <li> 14. <a href="http://hk.uwenku.com/question/p-fozhtuqt-ut.html" target="_blank" title="Grails的防止HTML修改"> Grails的防止HTML修改 </a> </li> <li> 15. <a href="http://hk.uwenku.com/question/p-xuvnqiyr-wr.html" target="_blank" title="如何防止HTML/JavaScript代碼修改"> 如何防止HTML/JavaScript代碼修改 </a> </li> <li> 16. <a href="http://hk.uwenku.com/question/p-nesrciva-xv.html" target="_blank" title="PHP - 如何刪除所有<script>和CDATA的HTML字符串與DOMDocument"> PHP - 如何刪除所有<script>和CDATA的HTML字符串與DOMDocument </a> </li> <li> 17. <a href="http://hk.uwenku.com/question/p-uwmwakkk-dk.html" target="_blank" title="PHP的DOMDocument如何節點的值轉換爲字符串"> PHP的DOMDocument如何節點的值轉換爲字符串 </a> </li> <li> 18. <a href="http://hk.uwenku.com/question/p-qlujbhhy-go.html" target="_blank" title="如何防止重複的HTML ID?"> 如何防止重複的HTML ID? </a> </li> <li> 19. <a href="http://hk.uwenku.com/question/p-tahwiatl-bgd.html" target="_blank" title="防止PHP解析字符串中的轉義字符"> 防止PHP解析字符串中的轉義字符 </a> </li> <li> 20. <a href="http://hk.uwenku.com/question/p-nefkfllq-pc.html" target="_blank" title="JTable防止字符串"> JTable防止字符串 </a> </li> <li> 21. <a href="http://hk.uwenku.com/question/p-honqegqk-rq.html" target="_blank" title="純PHP,從複雜的HTML字符串"> 純PHP,從複雜的HTML字符串 </a> </li> <li> 22. <a href="http://hk.uwenku.com/question/p-rctauxmz-bhw.html" target="_blank" title="防止HTML字符編碼輸出字符串"> 防止HTML字符編碼輸出字符串 </a> </li> <li> 23. <a href="http://hk.uwenku.com/question/p-qdeugozq-bdq.html" target="_blank" title="如何將XML字符串轉換爲PHP中的DOMDocument?"> 如何將XML字符串轉換爲PHP中的DOMDocument? </a> </li> <li> 24. <a href="http://hk.uwenku.com/question/p-pabeqxvc-bas.html" target="_blank" title="WebKit&Objective-C:如何將HTML字符串解析爲DOMDocument?"> WebKit&Objective-C:如何將HTML字符串解析爲DOMDocument? </a> </li> <li> 25. <a href="http://hk.uwenku.com/question/p-krglpqym-oa.html" target="_blank" title="修復時間字符串"> 修復時間字符串 </a> </li> <li> 26. <a href="http://hk.uwenku.com/question/p-tbozxlny-pm.html" target="_blank" title="我如何修復意外的T字符串? - PHP"> 我如何修復意外的T字符串? - PHP </a> </li> <li> 27. <a href="http://hk.uwenku.com/question/p-hyzmaspi-vx.html" target="_blank" title="jQuery - 修改HTML字符串"> jQuery - 修改HTML字符串 </a> </li> <li> 28. <a href="http://hk.uwenku.com/question/p-gygpyfki-ch.html" target="_blank" title="如何防止我的函數修改常量內的字符串?"> 如何防止我的函數修改常量內的字符串? </a> </li> <li> 29. <a href="http://hk.uwenku.com/question/p-pzlzmqpb-sm.html" target="_blank" title="如何修復「功能名稱必須是字符串」PHP"> 如何修復「功能名稱必須是字符串」PHP </a> </li> <li> 30. <a href="http://hk.uwenku.com/question/p-hosccqib-bdv.html" target="_blank" title="如何防止HTML"> 如何防止HTML </a> </li> </ul> </div> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1575177025"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img.uwenku.com/uwenku/script/side.js?t=1644592048261"></script> <script type="text/javascript" src="http://img.uwenku.com/uwenku/plugin/highlight/highlight.pack.js"></script> <link href="http://img.uwenku.com/uwenku/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="5415218910" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> 最新問題 </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://hk.uwenku.com/question/p-csmlyttv-tb.html" target="_blank" title="在角度工人中導入模塊?"> 在角度工人中導入模塊? </a> </li> <li class="side_article_list_item"> 2. <a href="http://hk.uwenku.com/question/p-qrtnwcvg-tn.html" target="_blank" title="Python布爾方法命名約定"> Python布爾方法命名約定 </a> </li> <li class="side_article_list_item"> 3. <a href="http://hk.uwenku.com/question/p-qvpcimgh-py.html" target="_blank" title="jquery background-image"> jquery background-image </a> </li> <li class="side_article_list_item"> 4. <a href="http://hk.uwenku.com/question/p-eyghaugq-qh.html" target="_blank" title="從s3檢索音頻時出錯"> 從s3檢索音頻時出錯 </a> </li> <li class="side_article_list_item"> 5. <a href="http://hk.uwenku.com/question/p-szhcyset-qt.html" target="_blank" title="如何將QR碼自動添加到圖像"> 如何將QR碼自動添加到圖像 </a> </li> <li class="side_article_list_item"> 6. <a href="http://hk.uwenku.com/question/p-oscplsex-rc.html" target="_blank" title="16個任務(1048.5 MB)的序列化結果的總大小大於spark.driver.maxResultSize(1024.0 MB)"> 16個任務(1048.5 MB)的序列化結果的總大小大於spark.driver.maxResultSize(1024.0 MB) </a> </li> <li class="side_article_list_item"> 7. <a href="http://hk.uwenku.com/question/p-sfvehlqe-rx.html" target="_blank" title="打字稿,使用類沒有構造"> 打字稿,使用類沒有構造 </a> </li> <li class="side_article_list_item"> 8. <a href="http://hk.uwenku.com/question/p-khjthsaj-pd.html" target="_blank" title="PHP通過除去空鍵"> PHP通過除去空鍵 </a> </li> <li class="side_article_list_item"> 9. <a href="http://hk.uwenku.com/question/p-nihddvmm-ne.html" target="_blank" title="Jest TypeError:無法讀取未定義的'商店'"> Jest TypeError:無法讀取未定義的'商店' </a> </li> <li class="side_article_list_item"> 10. <a href="http://hk.uwenku.com/question/p-fsfdvsjn-mm.html" target="_blank" title="在C++中有沒有一種慣用的方法來防止運行一組操作導致集合發生變化的情況?"> 在C++中有沒有一種慣用的方法來防止運行一組操作導致集合發生變化的情況? </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> 相關問題</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://hk.uwenku.com/question/p-kykwerlp-vz.html" target="_blank" title="如何防止剃刀修改Html字符串"> 如何防止剃刀修改Html字符串 </a> </li> <li class="side_article_list_item"> 2. <a href="http://hk.uwenku.com/question/p-yrrwnbos-th.html" target="_blank" title="如何防止Php的DOMDocument對html實體進行編碼?"> 如何防止Php的DOMDocument對html實體進行編碼? </a> </li> <li class="side_article_list_item"> 3. <a href="http://hk.uwenku.com/question/p-fenmumti-vm.html" target="_blank" title="操縱PHP domdocument字符串"> 操縱PHP domdocument字符串 </a> </li> <li class="side_article_list_item"> 4. <a href="http://hk.uwenku.com/question/p-kocwpjiq-rc.html" target="_blank" title="防止字符串上的Html編碼"> 防止字符串上的Html編碼 </a> </li> <li class="side_article_list_item"> 5. <a href="http://hk.uwenku.com/question/p-ceyhaslq-dg.html" target="_blank" title="如何防止PHP字符串在1997字符後截斷"> 如何防止PHP字符串在1997字符後截斷 </a> </li> <li class="side_article_list_item"> 6. <a href="http://hk.uwenku.com/question/p-srtslwbf-bcb.html" target="_blank" title="刪除回車字符從PHP tidy修復html字符串"> 刪除回車字符從PHP tidy修復html字符串 </a> </li> <li class="side_article_list_item"> 7. <a href="http://hk.uwenku.com/question/p-cybdwrfa-bhv.html" target="_blank" title="PHP RegEx防止重複字符"> PHP RegEx防止重複字符 </a> </li> <li class="side_article_list_item"> 8. <a href="http://hk.uwenku.com/question/p-yebazigy-qo.html" target="_blank" title="防止對URL字符串在PHP"> 防止對URL字符串在PHP </a> </li> <li class="side_article_list_item"> 9. <a href="http://hk.uwenku.com/question/p-bueabctd-bao.html" target="_blank" title="如何將UTF8字符串傳遞到您的PHP HTML API?"> 如何將UTF8字符串傳遞到您的PHP HTML API? </a> </li> <li class="side_article_list_item"> 10. <a href="http://hk.uwenku.com/question/p-dqxvfeyq-bne.html" target="_blank" title="如何防止字符串被攔截"> 如何防止字符串被攔截 </a> </li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://hk.uwenku.com/contact">聯系我們</a></li> <li>© 2020 HK.UWENKU.COM</li> <li><a target="_blank" href="https://beian.miit.gov.cn/">沪ICP备13005482号-4</a></li> <li><script type="text/javascript" src="https://v1.cnzz.com/z_stat.php?id=1280101193&web_id=1280101193"></script></li> <li><a href="http://www.uwenku.com/" target="_blank" title="优文库">简体中文</a></li> <li><a href="http://hk.uwenku.com/" target="_blank" title="優文庫">繁體中文</a></li> <li><a href="http://ru.uwenku.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.uwenku.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.uwenku.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.uwenku.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.uwenku.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.uwenku.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.uwenku.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.uwenku.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.uwenku.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.uwenku.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.uwenku.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f78a970f17b19a79fc477a3378096f29"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>