এইচটিএমএল 5-ট্যাগে পিএইচপি ডমডকুমেন্ট ত্রুটি / সতর্কতা


105

তাই আমি কোডের ভিতর বৈশিষ্ট্যাবলী / মানগুলি সেট করতে পারেন আমি পার্স HTML5 এর-কোড প্রয়াস করে থাকেন, কিন্তু এটা DOMDocument (PHP5.3) -এর মত ট্যাগ সমর্থন করে না বলে মনে হয় <nav>এবং <section>

পিএইচপি তে এইচটিএমএল হিসাবে পার্স করার এবং কোড ম্যানিপুলেট করার কোনও উপায় আছে কি?


পুনরুত্পাদন করার কোড:

<?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>");

ত্রুটি

সতর্কতা: ডোমডোকামেন্ট :: লোডএইচটিএমএল (): সত্ত্বায় ট্যাগ এনএভি অবৈধ, লাইন: 4 ইন / হোমে / ডাব্লুক্রাইএনএল / প্রজাতন্ত্র_এইচটিএমএল / নতুন-এমভিসি / 1.php লাইন 17 এ

সতর্কতা: ডোমডোকামেন্ট :: লোডএইচটিএমএল (): সত্ত্বায় ট্যাগ বিভাগটি অবৈধ, লাইন: 10 -home/wbkrnl/public_html/new-mvc/1.php লাইন 17 এ


ওপস, আমার জন্য loadHTML($HTML5)মিথ্যা ফিরিয়ে দেয় (ব্যর্থতা)! আমাকে নতুন ট্যাগগুলি ডিআইভিতে পরিবর্তন করতে হবে ... এটি কেবল আমার পর্দার "সতর্কতা" এর সমস্যা নয়।
পিটার ক্রাউস

2
এই সমস্যাটি পিএইচপি- জন্য bugs.php.net/bug.php?id=60021 তে জানানো হয়েছিল যা পরবর্তীতে অন্তর্নিহিত libxML2 তে একটি বৈশিষ্ট্য অনুরোধ
উত্সাহিত করেছে

উত্তর:


193

না, কোনও নির্দিষ্ট ডক্টাইপ নির্দিষ্ট করে ব্যবহারের জন্য বা বিদ্যমান প্রয়োজনীয়তার সংশোধন করার কোনও উপায় নেই।

আপনার সেরা কার্যক্ষম সমাধানটি এর সাথে ত্রুটি প্রতিবেদন অক্ষম করতে চলেছে libxml_use_internal_errors:

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

1
ওপস, আমার জন্য loadHTML($HTML5)মিথ্যা ফিরিয়ে দেয় (ব্যর্থতা)! আমাকে নতুন ট্যাগগুলি ডিআইভিতে পরিবর্তন করতে হবে ...
পিটার ক্রাউস

21
পিএইচপি 7 এর অন্তর্নির্মিত ডোম পার্সার এখনও কোনও কারণে HTML5 হ্যান্ডেল করতে পারে না? এই উত্তরটি জমা দেওয়ার পরে 6 বছর হয়ে গেছে।
সুপার বিড়াল

1
@ সুপ্রের্টিকাগুলি এগুলি সমস্ত অন্তর্নিহিত লাইবএক্সএমএল লাইব্রেরির উপর নির্ভরশীল।
একাকী দিন

6
--- এইচটিএমএল 5 এর উল্লেখ না করা এক্সএমএল নয়, কখনও ছিল না, ছিল না বা হবে না ...
কেভিন_কিনসে

2
আপডেট 2019 : সতর্কতাটি এখনও বহিস্কার করা হয়েছে তবে loadHTMLএখন আসলে HTML5 ট্যাগগুলি গ্রহণ করুন।

9

আপনি করতে পারেন

@$dom->loadHTML($htmlString);

16
ত্রুটি দমন এই সমস্যাটি মোকাবেলা করার উপযুক্ত উপায় নয়।
ক্লাস সানজার্স

6
@ ক্লাসস্যাঙ্গার্স যতক্ষণ না আমরা একটি পঙ্গু ডিওএম প্রয়োগ না করি, আমি ভয় করি এটি (হয় @বা এর মাধ্যমে libxml_*)
ড্যান লাগ

6
হ্যাঁ, এই নির্দিষ্ট ক্ষেত্রে ত্রুটি দমন করা আমার মতে সবচেয়ে ভাল সমাধান। আপনি যদি না জানেন যে এইচটিএমএল আপনি লোড হবেন, পিএইচপি এর সংজ্ঞা অনুযায়ী এটি 100% বৈধ এইচটিএমএল বলে মনে করা হয়। যা আমার অভিজ্ঞতায় হয় না।
hanshenrik

@ ক্লাসস্যাঙ্গার্স ... কেন নয়?
নিক ম্যানিং

পিএইচপি 8 "@ অপারেটর আর মারাত্মক ত্রুটিগুলি নিরব করে না সম্ভবত এই পরিবর্তনটি পিএইচপি 8 এর আগে আবার লুকিয়ে থাকা ত্রুটিগুলি প্রকাশ করতে পারে 8.. আপনার প্রোডাকশন সার্ভারে ডিসপ্লে_অরফারস = অফ করে নিশ্চিত করুন!" stitcher.io/blog/new-in-php-8
মার্কাস

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

সতর্কতা হত্যার কোনও উপায় বলে মনে হচ্ছে তবে ত্রুটি নয়। পিএইচপি-তে এমন ধ্রুবক রয়েছে যা এইগুলি করার কথা বলেছিল তবে তারা কাজ করে বলে মনে হচ্ছে না। এখানে যা করা উচিত তা হ'ল তবে (বাগ?) কারণ নয় ...

 $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 যে বাগটি স্থির করা হয়েছে
হুমম

1
কেবল পেডেন্টিক হতে হবে, এটি বৈধ HTML5 নয় 5 W3c.github.io/webcomponents/spec/custom/…
গ্রেগ

@ গ্রেগ জেনে রাখা ভাল। এক্সএমএল পার্সার প্রদর্শনের জন্য এটি কেবল পরীক্ষা যাচাই করতে হবে যে ট্যাগটি বৈধ নয়, তবে পতাকার কারণে এটিকে উপেক্ষা করুন।
ব্যবহারকারী 2782001

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

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