সতর্কতা: ডোমডোকামেন্ট :: লোডএইচটিএমএল (): এইচটিএমএল পার্সেন্টিটিফ: প্রত্যাশা ';' সত্তা,


90
$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

উত্তর:


149

সতর্কতা বাষ্পীভবন করতে, আপনি ব্যবহার করতে পারেন 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);

93

আমি বাজি ধরব যে আপনি যদি উত্সটির দিকে তাকান http://www.somesite.com/তবে এমন বিশেষ অক্ষর পাওয়া যাবে যা এইচটিএমএল রূপান্তরিত হয়নি। এরকম কিছু হতে পারে:

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

হতে হবে

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

4
কেবলমাত্র এটিকে প্রসারিত করার জন্য, যদি & চরিত্রটি এমনকি টেক্সটে থাকে এবং এইচটিএমএল বৈশিষ্ট্য নাও থাকে, তারপরেও এটিকে & amp; এড়িয়ে যেতে হবে। পার্সারটি ত্রুটিটি ফেলে দেওয়ার কারণটি এটি দেখার পরে এবং এটি প্রত্যাশার পরে; এইচটিএমএল সত্তা শেষ করতে।
কাইল

22
... এবং আরও প্রসারিত করার জন্য, কলিং htmlentities()বা স্ট্রিংয়ের অনুরূপ সমস্যার সমাধান করবে।
বেন

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

এটি ভুল, পরিবর্তে এটি ব্যবহার করুন:

@$dom->loadHTML($html);

26
বা om dom-> سختErrorChecking = মিথ্যা;
তেজরিরিমোরারি

8
এটি একটি ভয়াবহ সমাধান কারণ আপনি এই লাইনে ত্রুটিগুলি ডিবাগ করার জন্য একটি দুঃস্বপ্ন দেখাবেন। @ ডিউসওয়ার্ল্ডের সমাধানটি আরও ভাল।
গেরি

কি @জন্য?
ফ্রান্সিসকো

4
এটি একটি খুব নোংরা সমাধান এবং এটি সবকিছু ঠিক করবে না।
মিরকো ব্রুনার

4
আপনার উত্তরটি সমস্যার আশেপাশে কাজ করবে, "এটি ভুল" লাইনটি নিজেই, ভুল।
টেকব্র্যাট

15

দুটি ত্রুটি রয়েছে: দ্বিতীয়টি কারণ because ডোম কোনও স্ট্রিং নয় তবে একটি বস্তু এবং সুতরাং এটি "প্রতিধ্বনিত" হতে পারে না। প্রথম ত্রুটিটি লোডএইচটিএমএল থেকে একটি সতর্কতা, যা এইচটিএমএল নথির অবৈধ সিনট্যাক্সের কারণে লোড হতে পারে (সম্ভবত একটি & (অ্যাম্পারস্যান্ড) প্যারামিটার বিভাজক হিসাবে ব্যবহৃত হয়েছে এবং & এর সাথে সত্তা হিসাবে মুখোশযুক্ত নয়)।

আপনি ত্রুটি নিয়ন্ত্রণ অপারেটর "@" ( http://www.php.net/manual/en/language.operators.errorcontrol ) এর সাথে ফাংশনটি কল করে এই ত্রুটি বার্তাকে (ত্রুটি নয়, কেবলমাত্র বার্তাটি!) এড়িয়ে যান এবং দমন করেন । পিএইচপি )

@$dom->loadHTML($html);

12

আপনার মারাত্মক ত্রুটির কারণ ডমডোকামেন্টে একটি __toString () পদ্ধতি নেই এবং সুতরাং এটি প্রতিধ্বনিত করা যায় না।

আপনি সম্ভবত খুঁজছেন

echo $dom->saveHTML();

10

প্রতিধ্বনির নির্বিশেষে (যা মুদ্রণ_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. মার্কআপের বিষয়বস্তুগুলিতে পিএইচপি-র সত্তা-এনকোডিং ব্যবহার করুন, যা একটি সাধারণ ত্রুটি উত্স।


4
প্রথম সমাধানে আপনি ডকের পরিবর্তে ডোম লিখেছিলেন।
ম্যাথ এন্ড্রে-বটন্ড

এটি আমার জন্য কাজ করেছে আমি কেবলমাত্র $ সামগ্রী = এমবি_কভার্ট_ইনকোডিং ($ সামগ্রী, 'এইচটিএমএল-ENTITIES', 'ইউটিএফ -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 অনুসারে সমস্ত এইচটিএমএল বিশেষ চরিত্রগুলিও পালিয়ে যায়। উদাহরণস্বরূপ এইচটিএমএল কোডের এই অংশটি নিন <span>Hello World</span>। এটিকে চালনা htmlspecialcharsকরলে উত্পন্ন হবে &lt;span&gt;Hello World&lt/span&gt;যা এইচটিএমএল নয়। ডোমডোকামেন্ট :: লোডএইচটিএমএল এটিকে এইচটিএমএল হিসাবে আর স্ট্রিং হিসাবে বিবেচনা করবে না।
মোড় হুইস্পার

এটি আমার জন্য কাজ করে:$oDom = new DOMDocument(); $oDom->loadHTML($sHTML); echo html_entity_decode($oDom->saveHTML());
বার্তোমিয়েজ জাকুব কুয়েটেক

3

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আপনি যদি কখনও কখনও আপনার এইচটিএমএল-এর ত্রুটিযুক্ত & & চিহ্নগুলি ঠিক করতে চান। আপনি এর মতো কোড ব্যবহার করতে পারেন:

$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); ?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.