2011-05-22 30 views
84

पर PHP DOMDocument त्रुटियों/चेतावनियां मैं HTML5-कोड को पार्स करने का प्रयास कर रहा हूं, इसलिए मैं कोड के भीतर विशेषताओं/मान सेट कर सकता हूं, लेकिन ऐसा लगता है कि DOMDocument (PHP5.3) <nav> जैसे टैग का समर्थन नहीं करता है और <section>एचटीएमएल 5-टैग

क्या PHP में HTML के रूप में इसे पार्स करने और कोड में हेरफेर करने का कोई तरीका है? पुन: पेश करने


कोड:

<?php 
$dom = new DOMDocument(); 
$dom->loadHTML("<!DOCTYPE HTML> 
<html><head><title>test</title></head> 
<body> 
<nav> 
    <ul> 
    <li>first 
    <li>second 
    </ul> 
</nav> 
<section> 
    ... 
</section> 
</body> 
</html>"); 

त्रुटि

Warning: DOMDocument::loadHTML(): Tag nav invalid in Entity, line: 4 in /home/wbkrnl/public_html/new-mvc/1.php on line 17

Warning: DOMDocument::loadHTML(): Tag section invalid in Entity, line: 10 in /home/wbkrnl/public_html/new-mvc/1.php on line 17

+0

ऑप्स करता है' FALSE (विफलता) देता है! मुझे नए टैग को डीआईवी में बदलने की जरूरत है ... यह मेरी स्क्रीन पर केवल "चेतावनियों" की समस्या नहीं है। –

+1

इस समस्या को PHP के लिए https://bugs.php.net/bug पर रिपोर्ट किया गया था।php? id = 60021 जो बदले में अंतर्निहित libxml2 में एक फीचर अनुरोध उत्पन्न हुआ: https://bugzilla.gnome.org/show_bug.cgi?id=761534 – cweiske

उत्तर

136

नहीं है, वहाँ एक विशेष doctype का उपयोग करें, या की आवश्यकताओं को संशोधित करने के लिए निर्दिष्ट करने का कोई रास्ता नहीं है मौजूदा एक

आपका सबसे अच्छा से समस्या का समाधान libxml_use_internal_errors साथ रिपोर्टिंग त्रुटि निष्क्रिय करने के लिए होने जा रहा है:

$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML('...'); 
libxml_clear_errors(); 
+1

ओपीएस, मेरे लिए 'लोड HTML ($ HTML5) 'विफलता गलत (विफलता)! मुझे नए टैग को डीवीवी में बदलने की जरूरत है ... –

+0

बहुत बढ़िया, उत्तर के लिए बहुत बहुत धन्यवाद और @ Klaas प्रश्न के लिए धन्यवाद। – whitesiroi

+5

किसी भी कारण __ * php7 * __ के अंतर्निहित डोम पार्सर _still_ HTML5 को संभाल नहीं सकता है? यह जवाब सबमिट होने के 6 साल बाद हो गया है। –

7

तुम भी कर सकता है

@$dom->loadHTML($htmlString); 
+11

त्रुटि दमन इस मुद्दे से निपटने का एक उचित तरीका नहीं है। –

+4

@KlaasSangers जब तक हमारे पास एक गैर-अपंग डीओएम कार्यान्वयन नहीं होता है, मुझे डर है कि यह (या तो '@' या 'libxml_ *') – Dan

+5

हाँ के माध्यम से, इस विशिष्ट मामले में, मेरी राय में त्रुटि दमन सबसे अच्छा समाधान है। जब तक आप नहीं जानते कि HTML आप लोड हो रहे हैं, तो प्रति PHP की परिभाषा के अनुसार 100% मान्य HTML होना चाहिए। जो मेरे अनुभव में, कभी मामला नहीं है। – hanshenrik

5

आप त्रुटियों आप पार्सर से प्राप्त फ़िल्टर कर सकते हैं। यहाँ अन्य उत्तर के अनुसार, स्क्रीन पर त्रुटि की सूचना देना बंद कर देते हैं और फिर त्रुटियों के माध्यम से पुनरावृति और केवल लोगों को आप चाहते हैं दिखाने:

LibXMLError Object 
(
    [level] => 2 
    [code] => 801 
    [column] => 17 
    [message] => Tag section invalid 

    [file] => 
    [line] => 39 
) 
:

libxml_use_internal_errors(TRUE); 
// Do your load here 
$errors = libxml_get_errors(); 

foreach ($errors as $error) 
{ 
    /* @var $error LibXMLError */ 
} 

यहाँ एक ही त्रुटि की एक print_r() है

message और/या code पर मिलान करके, इन्हें आसानी से फ़िल्टर किया जा सकता है।

1

यह मेरे लिए काम किया:

$html = file_get_contents($url); 

$search = array("<header>", "</header>", "<nav>", "</nav>", "<section>", "</section>"); 
$replace = array("<div>", "</div>","<div>", "</div>", "<div>", "</div>"); 
$html = str_replace($search, $replace, $html); 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

आप हैडर टैग की जरूरत है, एक div टैग के साथ शीर्ष लेख बदल सकते हैं और एक आईडी का उपयोग करें। उदाहरण के लिए:

$search = array("<header>", "</header>"); 
$replace = array("<div id='header1'>", "</div>"); 

यह सबसे अच्छा समाधान नहीं है लेकिन स्थिति के आधार पर यह उपयोगी हो सकता है।

शुभकामनाएं।

-3

एचटीएमएल 5 टैग हमेशा आईडी, कक्षा आदि जैसे विशेषताओं का उपयोग करते हैं। तो प्रतिस्थापन के लिए कोड होगा:

$html = file_get_contents($url); 
$search = array(
    "<header", "</header>", 
    "<nav", "</nav>", 
    "<section", "</section>", 
    "<article", "</article>", 
    "<footer", "</footer>", 
    "<aside", "</aside>", 
    "<noindex", "</noindex>", 
); 
$replace = array(
    "<div", "</div>", 
    "<div", "</div>", 
    "<div", "</div>", 
    "<div", "</div>", 
    "<div", "</div>", 
    "<div", "</div>", 
    "<div", "</div>", 
); 
$html = str_replace($search, $replace, $html); 
$dom = new DOMDocument(); 
$dom->loadHTML($html); 
0

चेतावनियों को मारने का कोई तरीका नहीं है लेकिन त्रुटियों में नहीं। PHP में स्थिरांक हैं जो ऐसा करने वाले हैं, लेकिन वे काम नहीं कर रहे हैं। यहाँ चाहिए काम है क्या है, लेकिन मुझे `loadHTML ($ एचटीएमएल 5) के लिए, इसलिए नहीं कि (बग?) ....

$doc=new DOMDocument(); 
$doc->loadHTML("<tagthatdoesnotexist><h1>Hi</h1></tagthatdoesnotexist>", LIBXML_NOWARNING); 
echo $doc->saveHTML(); 

http://php.net/manual/en/libxml.constants.php

+0

यह एक निश्चित बग है: https://bugs.php.net/bug.php?id=74004 –

+0

इस पोस्ट के अनुसार https://stackoverflow.com/a/41845049/937477 कि बग तय किया गया है –