चेतावनी: DOMDocument :: loadHTML (): htmlParseEntityRef: 'उम्मीद;' इकाई में,


88
$html = file_get_contents("http://www.somesite.com/");

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

echo $dom;

फेंकता

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,
Catchable fatal error: Object of class DOMDocument could not be converted to string in test.php on line 10

जवाबों:


147

चेतावनी को वाष्पित करने के लिए, आप उपयोग कर सकते हैं libxml_use_internal_errors(true)

// create new DOMDocument
$document = new \DOMDocument('1.0', 'UTF-8');

// set error level
$internalErrors = libxml_use_internal_errors(true);

// load HTML
$document->loadHTML($html);

// Restore error level
libxml_use_internal_errors($internalErrors);

92

मैं शर्त लगाता हूं कि यदि आप अपने स्रोत को देखते http://www.somesite.com/हैं तो ऐसे विशेष वर्ण मिलेंगे जो HTML में परिवर्तित नहीं हुए हैं। शायद कुछ इस तरह:

<a href="/script.php?foo=bar&hello=world">link</a>

होना चाहिए

<a href="/script.php?foo=bar&amp;hello=world">link</a>

3
इस पर विस्तार करने के लिए, यदि & चरित्र पाठ में भी है और HTML विशेषता नहीं है, तो भी इसे & amp; तक भागने की आवश्यकता है; पार्सर त्रुटि को फेंकने का कारण है क्योंकि एक को देखने के बाद और यह एक उम्मीद कर रहा है; HTML इकाई को समाप्त करने के लिए।
काइल

21
... और आगे विस्तार करने के लिए, htmlentities()स्ट्रिंग पर कॉलिंग या समान समस्या को ठीक करेगा।
बेन

56
$dom->@loadHTML($html);

यह गलत है, इसके बजाय इसका उपयोग करें:

@$dom->loadHTML($html);

26
या $ डोम-> सख्तइंटरचेकिंग = गलत;
तजोरीमोर्री

6
यह एक भयानक समाधान है क्योंकि आप इस लाइन पर डिबग करने के लिए त्रुटियां करेंगे। @ डेव्सवर्ल्ड का घोल ज्यादा बेहतर है।
गेरी


2
यह एक बहुत ही गंदा समाधान है और यह सब कुछ ठीक नहीं करता है।
मिरको ब्रूनर

1
जबकि आपका जवाब समस्या के आसपास काम करेगा, लाइन "यह गलत है", स्वयं गलत है।
TecBrat

14

2 त्रुटियां हैं: दूसरी यह है कि $ डोम कोई स्ट्रिंग नहीं है, लेकिन एक वस्तु है और इस प्रकार "गूंज" नहीं हो सकती है। पहली त्रुटि लोड HTML से एक चेतावनी है, जो HTML दस्तावेज़ के अमान्य सिंटैक्स द्वारा लोड करने के लिए है (शायद एक और (एम्परसेंड) जिसे पैरामीटर विभाजक के रूप में उपयोग किया जाता है और & के साथ इकाई के रूप में नकाबपोश नहीं किया जाता है)।

आप त्रुटि नियंत्रण ऑपरेटर "@" ( http://www.php.net/manual/en/language.operators.errorcontrol ) के साथ फ़ंक्शन को कॉल करके इस त्रुटि संदेश को अनदेखा और दबा देते हैं (त्रुटि नहीं, बस संदेश!) । php )

@$dom->loadHTML($html);

12

आपके घातक त्रुटि का कारण DOMDocument में __toString () विधि नहीं है और इस प्रकार इसे प्रतिध्वनित नहीं किया जा सकता है।

आप शायद ढूंढ रहे हैं

echo $dom->saveHTML();

10

इको के बावजूद (जिसे Print_r या var_dump के साथ बदलने की आवश्यकता होगी), यदि कोई अपवाद फेंका जाता है तो वस्तु खाली रहनी चाहिए:

DOMNodeList Object
(
)

समाधान

  1. recoverसत्य पर, और strictErrorCheckingअसत्य पर सेट करें

    $content = file_get_contents($url);
    
    $doc = new DOMDocument();
    $doc->recover = true;
    $doc->strictErrorChecking = false;
    $doc->loadHTML($content);
    
  2. मार्कअप की सामग्री पर php की इकाई-एन्कोडिंग का उपयोग करें, जो सबसे आम त्रुटि स्रोत है।


1
पहले समाधान पर आपने डॉक्टर के बजाय डोम लिखा।
मेथे एंड्रे-बोटोंड

इसने मेरे लिए काम किया मैंने केवल $ सामग्री = mb_convert_encoding ($ सामग्री, 'HTML-ENTITIES', 'UTF-8') जोड़ी;
जसक पिट्ठल

8

सरल की जगह

$dom->loadHTML($html);

अधिक मजबूत के साथ ...

libxml_use_internal_errors(true);

if (!$DOM->loadHTML($page))
    {
        $errors="";
        foreach (libxml_get_errors() as $error)  {
            $errors.=$error->message."<br/>";
        }
        libxml_clear_errors();
        print "libxml errors:<br>$errors";
        return;
    }

8
$html = file_get_contents("http://www.somesite.com/");

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

echo $dom;

इसे इस्तेमाल करे


3

एक अन्य कब्ज़ेदार समाधान है

$sContent = htmlspecialchars($sHTML);
$oDom = new DOMDocument();
$oDom->loadHTML($sContent);
echo html_entity_decode($oDom->saveHTML());

यह काम नहीं करेगा। Php.net/manual/en/function.htmlspecialchars.php के अनुसार , सभी HTML विशेष वर्ण भी बच गए हैं। उदाहरण के लिए HTML कोड का यह टुकड़ा लें <span>Hello World</span>। इसे चलाने से एचटीएमएल का htmlspecialcharsउत्पादन &lt;span&gt;Hello World&lt/span&gt;नहीं होगा। DOMDocument :: loadHTML अब इसे HTML नहीं बल्कि एक स्ट्रिंग के रूप में व्यवहार करेगा।
ट्विस्टेड व्हिस्पर

यह मेरे लिए काम करता है:$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
बार्टोलोमिएज जकुब क्विज्टक

3

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन यदि आप कभी भी अपने HTML में विकृत और 'संकेतों को ठीक करना चाहते हैं। आप इसके समान कोड का उपयोग कर सकते हैं:

$page = file_get_contents('http://www.example.com');
$page = preg_replace('/\s+/', ' ', trim($page));
fixAmps($page, 0);
$dom->loadHTML($page);


function fixAmps(&$html, $offset) {
    $positionAmp = strpos($html, '&', $offset);
    $positionSemiColumn = strpos($html, ';', $positionAmp+1);

    $string = substr($html, $positionAmp, $positionSemiColumn-$positionAmp+1);

    if ($positionAmp !== false) { // If an '&' can be found.
        if ($positionSemiColumn === false) { // If no ';' can be found.
            $html = substr_replace($html, '&amp;', $positionAmp, 1); // Replace straight away.
        } else if (preg_match('/&(#[0-9]+|[A-Z|a-z|0-9]+);/', $string) === 0) { // If a standard escape cannot be found.
            $html = substr_replace($html, '&amp;', $positionAmp, 1); // This mean we need to escape the '&' sign.
            fixAmps($html, $positionAmp+5); // Recursive call from the new position.
        } else {
            fixAmps($html, $positionAmp+1); // Recursive call from the new position.
        }
    }
}

0

एक और उपयोगी समाधान है, हो सकता है कि आपकी फाइल ASCII प्रकार की हो, बस आपकी फाइलों का प्रकार बदल जाए।


-1

इसके बाद भी मेरा कोड ठीक काम कर रहा है, इसलिए मैंने सिर्फ 1 पंक्ति में इस कथन के साथ सभी चेतावनी संदेश हटा दिए हैं।

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