PHP DOMDocument त्रुटियों / HTML5- टैग पर चेतावनी


105

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

क्या इसे 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>");

त्रुटि

चेतावनी: DOMDocument :: loadHTML (): टैग नेवी में अमान्य, पंक्ति: 4/4 में /home/wbkrnl/public_html/new-mvc/1.php लाइन 17 पर

चेतावनी: DOMDocument :: loadHTML (): टैग इकाई अमान्य में अमान्य, पंक्ति: 10 / inhome/wbkrnl/public_html/new-mvc/1.php लाइन 17 पर


ऑप्स, मेरे लिए loadHTML($HTML5)FALSE (असफलता) लौटाता है! मुझे नए टैग को DIV में बदलने की आवश्यकता है ... यह केवल मेरी स्क्रीन पर "चेतावनी" की समस्या नहीं है।
पीटर क्रूस

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

जवाबों:


193

नहीं, किसी विशेष सिद्धांत को निर्दिष्ट करने, या मौजूदा की आवश्यकताओं को संशोधित करने का कोई तरीका नहीं है।

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

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

1
ऑप्स, मेरे लिए loadHTML($HTML5)FALSE (असफलता) लौटाता है! मुझे नए टैग को DIV में बदलने की आवश्यकता है ...
पीटर क्रूस 21

21
किसी भी कारण से php7 में निर्मित DOM पार्सर अभी भी HTML5 को नहीं संभाल सकता है? इस जवाब को प्रस्तुत किए 6 साल हो चुके हैं।
सुपर कैट

1
@SuperCat यह सभी अंतर्निहित libxml लाइब्रेरी पर निर्भर है।
lonesomeday

6
--- नहीं उल्लेख करने के लिए HTML5 XML नहीं है, कभी नहीं किया गया है, और न ही होगा ...
केविन_किंसी

2
अपडेट 2019 : चेतावनी को अभी भी निकाल दिया गया है लेकिन loadHTMLअब वास्तव में HTML5 टैग स्वीकार करते हैं।

9

आप भी कर सकते हैं

@$dom->loadHTML($htmlString);

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

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

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

@KlaasSangers ... क्यों नहीं?
निक मैनिंग

PHP8 "@ ऑपरेटर अब घातक त्रुटियों को चुप नहीं करता है यह संभव है कि यह परिवर्तन उन त्रुटियों को प्रकट कर सकता है जो फिर से PHP 8 से पहले छिपे हुए थे। अपने उत्पादन सर्वर पर display_errors = बंद सेट करना सुनिश्चित करें!" टांका .io
blog/

7

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

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

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

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

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

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

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


2

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

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

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


इस पोस्ट के अनुसार stackoverflow.com/a/41845049/937477 कि बग को ठीक कर दिया गया है
mmmmm

1
बस पांडित्यपूर्ण होना, यह मान्य नहीं है HTML5। कस्टम तत्वों को कल्पना w3c.github.io/webcompenders/spec/custom/… के
ग्रेग

@ अच्छा पता है। यह सिर्फ एक परीक्षण है एक्सएमएल पार्सर को प्रदर्शित करने के लिए पहचान लेंगे कि टैग वैध नहीं है, लेकिन ध्वज की वजह से इसे अनदेखा करें।
user2782001

0

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

$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);

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

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

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

सौभाग्य।


-5

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

$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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.