কোনও স্ট্রিং এইচটিএমএল কিনা তা পরীক্ষা করে দেখুন


103

আমার একটি নির্দিষ্ট স্ট্রিং রয়েছে যার জন্য আমি এটিটি এইচটিএমএল কিনা তা যাচাই করতে চাই। আমি একই জন্য রেজেক্স ব্যবহার করছি তবে সঠিক ফলাফল পাচ্ছি না।

আমি আমার রেজেক্সকে বৈধতা দিয়েছি এবং এটি এখানে দুর্দান্ত কাজ করে ।

var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);

এখানে হুড়োহুড়ি কিন্তু রেজেেক্স সেখানে চলছে না। http://jsfiddle.net/wFWtc/

আমার মেশিনে, কোডটি ঠিকঠাক হয় তবে ফল হিসাবে সত্যের পরিবর্তে আমি একটি মিথ্যা পাই। এখানে কি অনুপস্থিত?


5
এইচটিএমএল পার্স করতে একটি HTML পার্সার ব্যবহার করুন। অনুগ্রহ করে পড়ুন এই যদি আপনি ইতিমধ্যে না।
ফ্রিডরিক হামিদী

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

4
এটি চেক থেকে আপনি কী স্তরের পরিশীলনের চান তা নির্ভর করে। স্ট্রিংটিতে কমপক্ষে একটি <এবং কমপক্ষে একটি রয়েছে >এবং এটি এইচটিএমএল কল করতে পারে কিনা তা আপনি যাচাই করতে পারেন, বা আপনি সঠিক HTML বাক্য গঠন বা এর মধ্যবর্তী যে কোনও কিছুতে এটি কঠোরভাবে বৈধ কিনা তা পরীক্ষা করতে পারেন। সহজতম ক্ষেত্রেগুলির জন্য একটি HTML পার্সার প্রয়োজন হয় না।
জেজেজে

4
আপনি কেন স্ট্রিংটি এইচটিএমএল তা পরীক্ষা করেন?
nhahtdh

4
@ ব্যবহারকারী 1240679: বৈধ মার্কআপ ফর্ম্যাট? বৈধতা কি ধরনের? কঠোর অর্থে, এটি বর্ণনা করার জন্য আপনার ডিটিডি দরকার। আলগা অর্থে, আপনি ট্যাগগুলি সঠিকভাবে মিলেছে কিনা তা পরীক্ষা করতে চাইতে পারেন। উপরের দুটি ক্ষেত্রে দুটিই রেজেক্সের চাকরি নয়।
nhahtdh

উত্তর:


323

কোনও স্ট্রিং এইচটিএমএল কিনা তা পরীক্ষা করার জন্য আরও ভাল রেগেক্স ব্যবহার করতে হবে:

/^/

উদাহরণ স্বরূপ:

/^/.test('') // true
/^/.test('foo bar baz') //true
/^/.test('<p>fizz buzz</p>') //true

আসলে, এটা খুব ভাল, এটা ফিরে আসবেন trueজন্য যে এটি পাস স্ট্রিং, যা কারণ যে স্ট্রিং এইচটিএমএল হয় । মারাত্মকভাবে, এমনকি এটি খারাপভাবে ফর্ম্যাট করা বা অবৈধ হলেও এটি এখনও এইচটিএমএল।

আপনি যা সন্ধান করছেন তা হ'ল এইচটিএমএল উপাদানগুলির উপস্থিতি, কেবল কোনও পাঠ্য সামগ্রীর চেয়ে, আপনি কিছু লাইন ধরে ব্যবহার করতে পারেন:

/<\/?[a-z][\s\S]*>/i.test()

এটি আপনাকে কোনওভাবেই এইচটিএমএল পার্স করতে সহায়তা করবে না, তবে এটি অবশ্যই এইচটিএমএল উপাদানগুলি ধারণ করে স্ট্রিংটিকে পতাকাঙ্কিত করবে।


54
আমি সত্যই অবাক হয়েছি আমি স্ন্যার্কের জন্য আরও ডাউনটাও পাইনি।
zzzzBov

8
@ ক্লেমেট, তাই আপনি a < b && a > cHTML হিসাবে বিবেচনা করছেন?
zzzzBov

4
@zzzzBov আপনি জানেন যে আপনি a<b && a>cএইচটিএমএল বলে মনে করেন ... আমি আশা করি HTML সনাক্তকরণটি এত বেশি সরল করা যায়। পার্সিং কখনও সহজ নয়।
অরিয়াদম

4
@ ওরিয়াদম, প্রসঙ্গটি সেই ক্ষেত্রে উপাদানগুলি সনাক্ত করার জন্য ছিল। আপনি ব্যবহার করেন তাহলে a < b && a > cব্রাউজার চালু হবে >এবং <মধ্যে অক্ষর &gt;এবং &lt;উপযুক্তভাবে সত্ত্বা। পরিবর্তে, যদি আপনি a<b && a>cব্রাউজারটি ব্যবহার করেন তবে মার্কআপটিকে ব্যাখ্যা করবে a<b && a>c</b>কারণ কোনও জায়গার অভাব মানেই <bকোনও <b>উপাদান খোলে । আমি যা বলছি তার একটি দ্রুত ডেমো এখানে
zzzzBov

5
এটি সম্ভবত আমি সর্বাধিক ভোট দেওয়া ট্রোল উত্তর seen ;)
এন্ডিস

75

পদ্ধতি # 1 । স্ট্রিংটিতে এইচটিএমএল ডেটা রয়েছে কিনা তা পরীক্ষা করার জন্য এখানে সহজ কাজ রয়েছে:

function isHTML(str) {
  var a = document.createElement('div');
  a.innerHTML = str;

  for (var c = a.childNodes, i = c.length; i--; ) {
    if (c[i].nodeType == 1) return true; 
  }

  return false;
}

ব্রাউজারের ডিওএম পার্সারটিকে সরবরাহের স্ট্রিংটি এইচটিএমএল এর মতো দেখায় বা না দেখায় তা সিদ্ধান্ত নিতে অনুমতি দেওয়া হয়। আপনি দেখতে পাচ্ছেন এটি কেবল ELEMENT_NODE( nodeType1 এর) জন্য পরীক্ষা করে ।

আমি বেশ কয়েকটি পরীক্ষা করেছি এবং দেখে মনে হচ্ছে এটি কার্যকর হয়:

isHTML('<a>this is a string</a>') // true
isHTML('this is a string')        // false
isHTML('this is a <b>string</b>') // true

এই দ্রষ্টব্যটি সঠিকভাবে এইচটিএমএল স্ট্রিং সনাক্ত করতে পারে তবে এর পার্শ্ব প্রতিক্রিয়া রয়েছে যা ইম্জি / ভিডিও / ইত্যাদি। ট্যাগগুলি একবার অভ্যন্তরীণ এইচটিএমএলে পার্স করা সংস্থান ডাউনলোড শুরু করবে start

পদ্ধতি # 2 । অন্য একটি পদ্ধতি DOMParser ব্যবহার করে এবং লোডিং সংস্থানগুলির পার্শ্ব প্রতিক্রিয়া নেই:

function isHTML(str) {
  var doc = new DOMParser().parseFromString(str, "text/html");
  return Array.from(doc.body.childNodes).some(node => node.nodeType === 1);
}

দ্রষ্টব্য:
1. Array.fromES2015 পদ্ধতি, এর সাথে প্রতিস্থাপন করা যেতে পারে [].slice.call(doc.body.childNodes)
২. someকলের তীর ফাংশনটি সাধারণ বেনাম ফাংশন দিয়ে প্রতিস্থাপন করা যেতে পারে।


4
এটি একটি দুর্দান্ত ধারণা। তবে এই ফাংশনটি ক্লোজিং ট্যাগ (যেমন isHTML("</a>") --> false) সনাক্ত করতে পারেনি ।
লুইস

9
দুর্দান্ত সমাধান! .. এর একমাত্র নেতিবাচক পার্শ্ব-প্রভাব এটি হ'ল যদি আপনার এইচটিএমএলতে কোনও চিত্র src অ্যাট্রিবিউটের মতো স্থিতিশীল সংস্থান থাকে .. innerHTMLব্রাউজারটি সেই সংস্থানগুলি আনতে শুরু করবে। :(
জোসে ব্রাউন

@ জোসেব্রাউনটি কি এটি ডিওএম-এ যুক্ত না হলেও?
কুউস

4
@ কুউস হ্যাঁ, সংযোজন না হলেও। DOMParser সমাধান ব্যবহার করুন।
dfsq

4
ভাল ধারণা, কিন্তু গৃহীত উত্তরগুলি কি পারফরম্যান্সের জন্য ভাল হবে না? বিশেষত আপনার যদি বিশাল স্ট্রিং থাকে (পাং উদ্দেশ্যযুক্ত) বা আপনার যদি এই পরীক্ষাটি অনেক বেশি ব্যবহার করতে হয়।
DerpyNerd

13

এর সাথে কিছুটা বৈধতা:

/<(?=.*? .*?\/ ?>|br|hr|input|!--|wbr)[a-z]+.*?>|<([a-z]+).*?<\/\1>/i.test(htmlStringHere) 

এটি খালি ট্যাগগুলির জন্য অনুসন্ধান করে (কিছু পূর্বনির্ধারিত) এবং /এক্সএইচটিএমএল খালি ট্যাগগুলি বাতিল করে এবং খালি ট্যাগের কারণে এইচটিএমএল হিসাবে বৈধতা দেয় অথবা ট্যাগের নামটি ধরে ফেলবে এবং এইচটিএমএল হিসাবে বৈধ হওয়ার জন্য স্ট্রিংয়ের কোথাও এটি ক্লোজিং ট্যাগটি সন্ধান করার চেষ্টা করবে।

বর্ণিত ডেমো: http://regex101.com/r/cX0eP2

হালনাগাদ:

এর সাথে সম্পূর্ণ বৈধতা:

/<(br|basefont|hr|input|source|frame|param|area|meta|!--|col|link|option|base|img|wbr|!DOCTYPE).*?>|<(a|abbr|acronym|address|applet|article|aside|audio|b|bdi|bdo|big|blockquote|body|button|canvas|caption|center|cite|code|colgroup|command|datalist|dd|del|details|dfn|dialog|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frameset|head|header|hgroup|h1|h2|h3|h4|h5|h6|html|i|iframe|ins|kbd|keygen|label|legend|li|map|mark|menu|meter|nav|noframes|noscript|object|ol|optgroup|output|p|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video).*?<\/\2>/i.test(htmlStringHere) 

এটি যথাযথ বৈধতা দেয় কারণ এতে সমস্ত এইচটিএমএল ট্যাগ রয়েছে , খালিগুলি প্রথমে বাকী অনুসরণ করে যার জন্য একটি ক্লোজিং ট্যাগ প্রয়োজন।

এখানে বর্ণিত ডেমো: http://regex101.com/r/pE1mT5


4
নীচের অংশীকরণটি কেবল একটি নোটই কাজ করে তবে এটি "'<strong> হ্যালো ওয়ার্ল্ড" এর মতো অনাবৃত এইচটিএমএল ট্যাগগুলি সনাক্ত করতে পারে না। অনুমোদিত এইটি এইচটিএমএল নষ্ট হয়ে গেছে সুতরাং স্ট্রিং হিসাবে বিবেচনা করা উচিত তবে ব্যবহারিক উদ্দেশ্যে আপনার অ্যাপ্লিকেশন এগুলি সনাক্ত করতে পারে।
TK123

এইচটিএমএল ব্যবহারকারী-এজেন্টদের ক্ষমা মাথায় রেখে তৈরি করা হয়েছে। "অবৈধ" ট্যাগগুলি অবৈধ নয়, এগুলি কেবল অজানা, এবং অনুমোদিত। "অবৈধ" বৈশিষ্ট্যগুলি অবৈধ নয় ... এটি বিশেষত উল্লেখযোগ্য হয় যখন কেউ "ওয়েব উপাদান" এবং জেএসএক্সের মতো প্রযুক্তিগুলিকে জড়িত করা শুরু করে যা এইচটিএমএল এবং আরও সমৃদ্ধ উপাদান বিবরণকে মিশ্রিত করে, সাধারণত ছায়া ডিওএম তৈরি করে। চড় এই একটি ফাইল এবং Eval মধ্যে document.querySelector('strange')- এটা কাজ করব।
amcgregor

(সংক্ষিপ্তসার হিসাবে: স্পেসিফিকেশনটি কীভাবে লিখিত হয়েছে, এইচটিএমএল চিহ্নিতকরণের চেষ্টা করা মূলত একটি মূর্খের কাজ। একটি "অবৈধ" উপাদান সহ একটি নমুনা এইচটিএমএল ডকুমেন্টকে দেওয়া লিঙ্কটি সেখানে একটি 100% সম্পূর্ণ-গঠিত, সম্পূর্ণ HTML ডকুমেন্ট -আর যেহেতু অন্য একটি উদাহরণ 1997 হিসাবে হয়েছে)।
amcgregor

10

উপরের zzzzBov এর উত্তর ভাল, তবে এটি বিপথগামী ক্লোজিং ট্যাগগুলির জন্য অ্যাকাউন্ট নয়, যেমন:

/<[a-z][\s\S]*>/i.test('foo </b> bar'); // false

এমন একটি সংস্করণ যা ক্লোজিং ট্যাগগুলি ক্যাচ করে এটি হতে পারে:

/<[a-z/][\s\S]*>/i.test('foo </b> bar'); // true

এটিকে মন্তব্য হিসাবে পোস্ট করার পরিবর্তে একটি সম্পাদনার পরামর্শ দেওয়া ভাল হতে পারে।
জ্লাটিন জ্লেটেভ

আমি মনে করি আপনি বোঝাতে চেয়েছেন <[a-z/][\s\S]*>- প্রথম গ্রুপে স্ল্যাশটি নোট করুন।
রায়ান গিল

7

এখানে সময়ে সময়ে আমি ব্যবহার করি এমন একটি স্লোপ ওয়ান-লাইনার:

var isHTML = RegExp.prototype.test.bind(/(<([^>]+)>)/i);

এটি মূলত ফিরে আসবে trueএকটি ধারণকারী স্ট্রিং জন্য <দ্বারা অনুসরণ ANYTHINGদ্বারা অনুসরণ >

দ্বারা ANYTHING, আমি মূলত একটি খালি স্ট্রিং ছাড়া কিছুই বোঝাতে চাই।

এটি দুর্দান্ত নয়, তবে এটি ওয়ান লাইনার।

ব্যবহার

isHTML('Testing');               // false
isHTML('<p>Testing</p>');        // true
isHTML('<img src="hello.jpg">'); // true
isHTML('My < weird > string');   // true (caution!!!)
isHTML('<>');                    // false

আপনি দেখতে পাচ্ছেন যে এটি নিখুঁত থেকে অনেক দূরে, তবে কিছু ক্ষেত্রে এটি আপনার পক্ষে কাজ করতে পারে।


4
ঠিক যেটা আমার দরকার ছিল. কিছুই অভিনব, শুধু পরিষ্কার। ধন্যবাদ!
ময়েস্কুল

6

এখানে সমস্ত উত্তর অতিরিক্ত-সমেত রয়েছে, সেগুলি কেবল <অনুসরণ অনুসরন করে >। কোনও স্ট্রিং এইচটিএমএল কিনা তা সনাক্ত করার কোনও সঠিক উপায় নেই তবে আপনি আরও ভাল করতে পারেন।

নীচে আমরা শেষ ট্যাগগুলি সন্ধান করি এবং এটি আরও কঠোর এবং আরও নির্ভুল হবে:

import re
re_is_html = re.compile(r"(?:</[^<]+>)|(?:<[^<]+/>)")

এবং এখানে এটি কার্যকর হয়:

# Correctly identified as not HTML:
print re_is_html.search("Hello, World")
print re_is_html.search("This is less than <, this is greater than >.")
print re_is_html.search(" a < 3 && b > 3")
print re_is_html.search("<<Important Text>>")
print re_is_html.search("<a>")

# Correctly identified as HTML
print re_is_html.search("<a>Foo</a>")
print re_is_html.search("<input type='submit' value='Ok' />")
print re_is_html.search("<br/>")

# We don't handle, but could with more tweaking:
print re_is_html.search("<br>")
print re_is_html.search("Foo &amp; bar")
print re_is_html.search("<input type='submit' value='Ok'>")

4

যদি আপনি একটি স্ট্রিং আক্ষরিক থেকে একটি রেজেক্স তৈরি করে থাকেন তবে আপনাকে কোনও ব্যাকস্ল্যাশ থেকে বাঁচতে হবে:

var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\\b[^>]*>(.*?)</\\1>");
// extra backslash added here ---------------------^ and here -----^

আপনি যদি একটি রেজেক্স আক্ষরিক ব্যবহার করেন তবে এটি প্রয়োজনীয় নয় তবে তারপরে আপনাকে এগিয়ে স্ল্যাশগুলি থেকে বাঁচতে হবে:

var htmlRegex = /<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)<\/\1>/;
// forward slash escaped here ------------------------^

এছাড়াও আপনার jsfiddle কাজ করেনি কারণ আপনি onloadঅন্য হ্যান্ডলারের ভিতরে কোনও onloadহ্যান্ডলারকে বরাদ্দ করেছেন - বামদিকে ফ্রেমওয়ার্ক এবং এক্সটেনশানস প্যানেলে সেট করা ডিফল্টটি জেএসকে মোড়কে onload। এটিকে এখনি্যাপ বিকল্পে পরিবর্তন করুন এবং স্ট্রিং আক্ষরিক অব্যাহতিটি ঠিক করুন এবং এটি "কাজ করে" (প্রত্যেকেই মন্তব্যগুলিতে চিহ্নিত করেছেন এমন বাঁধাগুলির মধ্যে): http://jsfiddle.net/wFWtc/4/

আমি যতদূর জানি জাভাস্ক্রিপ্টের নিয়মিত এক্সপ্রেশনগুলির ব্যাক-রেফারেন্স নেই। সুতরাং আপনার প্রকাশের এই অংশ:

</\1>

জেএসে কাজ করবে না (তবে অন্য কয়েকটি ভাষায় কাজ করবে)।



ঠিক আছে, এটি পরীক্ষা করে দেখবে যে কোনও একটি ট্যাগ দেখতে ঠিক আছে, তবে বাকিগুলি সম্পর্কে কিছুই নেই। ওপি কী ধরণের "বৈধতা" চায় তা নিশ্চিত নয়।
nhahtdh

4
<br> <hr> <input...>@ ইউজার 1240679 সম্পর্কে কী?
সিএসᵠ

3

/<\/?[^>]*>/.test(str) এটিতে এইচটিএমএল ট্যাগ রয়েছে কিনা তা সনাক্ত করুন, এটি কোনও এক্সএমএল হতে পারে


27 is < 42, and 96 > 42. এটি এইচটিএমএল নয়।
amcgregor

3

JQuery সহ:

function isHTML(str) {
  return /^<.*?>$/.test(str) && !!$(str)[0];
}

4
isHTML("<foo>");// রিটার্নটি সত্য isHTML("div");// divপৃষ্ঠায় যদি থাকে সত্য হয়
ACK_stoverflow

@yekta - আপনি কি সম্পর্কে গ্রহণ করছেন? এই স্ট্রিংটি এইচটিএমএল কিনা তা পরীক্ষা করার কথা। আমি যতদূর জানি একটি ইমেল কোনও এইচটিএমএল ট্যাগ নয় ... এটিএইচটিএমএল ('foo@bar.com ') -> মিথ্যা // সঠিক
gtourie

4
একটি স্ট্রিং যে কোনও কিছু হতে পারে, আপনি যদি এটির একটি এইচটিএমএল ট্যাগ জানেন তবে কেন এটির এইচটিএমএল প্রথম স্থানে রয়েছে তা পরীক্ষা করে দেখুন, আমি আপনার পয়েন্টটি বেশ অনুসরণ করি না। @একটি নির্বাচক জন্য একটি বৈধ সিনট্যাক্স নয়। সুতরাং আপনি যখন এটি কোনও জিকিউরি সিলেক্টরের কাছে পাস করেন, তখন এটি একটি ব্যতিক্রম (যেমন $("you@example.com")থেকে !!$(str)[0]) ফেলে দেবে । আমি বিশেষভাবে !!$(str)[0] অংশ উল্লেখ করছি । আপনি কেবল আপনার উত্তর সম্পাদনা করেছেন, তবে এখন আপনি jQuery কিছু করার আগে এইচটিএমএল পরীক্ষা করছেন।
ইয়েকটা

আমি মনে করি না যে লেখক এটি পরীক্ষা করতে চেয়েছিলেন এটি কেবল একটি স্ট্রিং কিনা was এটাই আসল কথা. তিনি যা চেয়েছিলেন তা হ'ল এইচটিএমএল নয়, স্ট্রিংটি একটি বৈধ এইচটিএমএল ট্যাগ কিনা তা যাচাই করতে সক্ষম একটি ফাংশন ছিল otherwise @ACK_stoverflow মন্তব্যটি পড়ার পরে আমি আমার উত্তর আপডেট করেছি, তবে আমি নিশ্চিত যে একটি সাধারণ রেজেক্স এটি করা উচিত।
gtourie

3

এই ক্ষেত্রে jQuery ব্যবহার করে, সহজ ফর্মটি হ'ল:

if ($(testString).length > 0)

যদি $(testString).length = 1, এর অর্থ এটির ভিতরে একটি HTML ট্যাগ রয়েছে textStging


ঠিক নীচে উত্তর অনুসারে ("এর আগে চার বছর আগে লিখিত" jQuery দিয়ে শুরু করুন "), একক প্রবেশ বিন্দু থেকে একাধিক ব্যবহারের দুর্বল পছন্দ বিবেচনা করুন। $()একটি সিএসএস নির্বাচক অপারেশন। পাঠ্য এইচটিএমএল সিরিয়ালাইজেশন থেকে একটি ডোম নোড কারখানাও। তবে… jQuery এর উপর একই নির্ভরতার ফলে ভুগতে থাকা অন্যান্য উত্তর অনুসারে, "ডিভ" HTML নয়, তবে পৃষ্ঠায় trueকোনও <div>উপাদান উপস্থিত থাকলে তা ফিরে আসবে । এটি একটি খুব, খুব খারাপ দৃষ্টিভঙ্গি, যেহেতু আমি অগত্যা jQuery জড়িত প্রায় কোনও সমাধানের সাথে প্রত্যাশা করতে বড় হয়েছি। (এটা মরতে দাও।)
amcgregor

2

ব্রাউজারটি নিজেই টেক্সট বিশ্লেষণ করার চেষ্টা করার সাথে সাথে কোনও ডিওএম নোড নির্মিত হয়েছিল কিনা তা সনাক্ত করার জন্য অভিনব সমাধান রয়েছে ... যা ধীর হবে। বা নিয়মিত এক্সপ্রেশন যা দ্রুত হবে তবে ... সম্ভাব্যভাবে সঠিক নয়। এই সমস্যা থেকে দুটি খুব স্বতন্ত্র প্রশ্ন উত্থাপিত হয়:

Q1: একটি স্ট্রিংতে কি এইচটিএমএল টুকরা রয়েছে?

এইচটিএমএল উপাদান চিহ্নিতকরণ বা এনকোড সত্তা সমন্বিত এইচটিএমএল নথির স্ট্রিং অংশ ? এটি একটি সূচক হিসাবে ব্যবহার করা যেতে পারে যে স্ট্রিংয়ের জন্য ব্লিচিং / স্যানিটাইজেশন বা সত্তা ডিকোডিংয়ের প্রয়োজন হতে পারে:

/</?[a-z][^>]*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);/

এই লেখার সময় আপনি বিদ্যমান বিদ্যমান উত্তর থেকে সমস্ত উদাহরণের বিপরীতে ব্যবহার করতে পারেন এবং আরও কিছু… বরং ঘৃণ্য WYSIWYG- বা শব্দ-উত্পন্ন নমুনা পাঠ্য এবং বিভিন্ন চরিত্রের সত্তার উল্লেখগুলি।

প্রশ্ন 2: স্ট্রিংটি কি এইচটিএমএল ডকুমেন্ট?

এইচটিএমএল স্পেসিফিকেশন অত্যন্ত আপত্তিকররূপে কি এটি একটি HTML ডকুমেন্ট বিবেচনায় হিসেবে শিথিল । ব্রাউজারগুলি এইচটিএমএল হিসাবে প্রায় কোনও আবর্জনা পাঠকে পার্স করতে চরম দৈর্ঘ্যে চলে যায় to দুটি পদ্ধতির: হয় কেবল HTML- কে সব কিছু বিবেচনা করুন (যেহেতু যদি কোনও text/htmlবিষয়বস্তুর সাথে সরবরাহ করা হয় তবে ব্যবহারকারী-এজেন্ট দ্বারা এটি HTML হিসাবে ব্যাখ্যা করার চেষ্টা করার জন্য দুর্দান্ত প্রচেষ্টা ব্যয় করা হবে ) বা উপসর্গ চিহ্নিতকারীটির সন্ধান করুন:

<!DOCTYPE html>

"সুগঠিততা" এর নিরিখে, এটি এবং অন্য কোনও কিছুই "প্রয়োজনীয়" নয়। নীচেরটি একটি 100% সম্পূর্ণ, সম্পূর্ণ বৈধ এইচটিএমএল ডকুমেন্ট যা আপনার মনে হয় যে প্রতিটি HTML উপাদান বাদ দেওয়া হচ্ছে:

<!DOCTYPE html>
<title>Yes, really.</title>
<p>This is everything you need.

হা. সেখানে কিভাবে যেমন "অনুপস্থিত" উপাদান গঠন উপর স্পষ্ট নিয়ম আছে <html>, <head>এবং <body>। যদিও আমি এটি বরং মজাদার বলে মনে করি যে এসও এর সিনট্যাক্স হাইলাইটিং সুস্পষ্ট ইঙ্গিত ছাড়াই সঠিকভাবে এটি সনাক্ত করতে ব্যর্থ হয়েছিল।


0

আমার সমাধানটি হ'ল

const element = document.querySelector('.test_element');

const setHtml = elem =>{
    let getElemContent = elem.innerHTML;

    // Clean Up whitespace in the element
    // If you don't want to remove whitespace, then you can skip this line
    let newHtml = getElemContent.replace(/[\n\t ]+/g, " ");

    //RegEX to check HTML
    let checkHtml = /<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)<\/\1>/.test(getElemContent);

    //Check it is html or not
    if (checkHtml){
        console.log('This is an HTML');
        console.log(newHtml.trim());
    }
    else{
        console.log('This is a TEXT');
        console.log(elem.innerText.trim());
    }
}

setHtml(element);

আপনার নিয়মিত প্রকাশটি অত্যন্ত ত্রুটিপূর্ণ বনাম বনাম আরও বিস্তৃত অভিব্যক্তি বলে মনে হচ্ছে এবং প্রাক-প্রক্রিয়াজাতকরণের (প্রাথমিক প্রতিস্থাপন) প্রয়োজন অত্যন্ত দুর্ভাগ্যজনক।
amcgregor

-1

এইচটিএমএল-এর একটি এনপিএম প্যাকেজ রয়েছে যা এই https://github.com/sindresorhus/is-html সমাধান করার চেষ্টা করতে পারে


ঘোষিত ডক্টাইপ ব্যতীত যে ব্যর্থতাটি ব্যবহার করার চেষ্টা করছে তা আমি বুঝতে পারছি না এবং অতিরিক্ত নির্ভরতা থেকে টানা জ্ঞাত এইচটিএমএল উপাদানগুলি থেকে নির্মিত "পূর্ণ" প্যাটার্নটি এই সত্যটি এইচটিএমএল কীভাবে কাজ করে না তা উপেক্ষা করে, এবং তা করেনি খুব, খুব দীর্ঘ সময়ের জন্য অতিরিক্তভাবে, বেস প্যাটার্নটি স্পষ্টভাবে উল্লেখ করে <html>এবং <body>ট্যাগগুলি উভয়ই সম্পূর্ণ alচ্ছিক । "মিলছে না এক্সএমএল" পরীক্ষাটি বলছে।
amcgregor

@ এমসিগ্রিগোর যদি আপনি নিজের সমাধানটি আরও ভাল বলে মনে করেন তবে এইচটিএমএল রেপোতে অবদান রাখতে পারেন? এবং regex101 থেকে আপনার স্যুট পরীক্ষাগুলি যুক্ত করবেন? এটি সম্প্রদায়ের কাছে মূল্যবান হবে
কলিন ডি

এই লাইব্রেরির মূল উদ্দেশ্যটি বিপথগামী এবং ট্যাগগুলির উপস্থিতিটির কারণে এটি এইচটিএমএল নয় এমন হিসাবে মিথ্যা-পতাকাঙ্কণ দ্বারা সাধারণত সংখ্যক মামলায় সহজাত ভুল হবে; বৈধতা এইভাবে সফল হতে পারে না। অধিকন্তু, একটি সরল রেজেক্স বা একটি (সম্পাদনা: যুগল ) পাঠক [আইস]… আমরা কীভাবে প্রোগ্রাম করবেন তা ভুলে গিয়ে থাকতে পারি , এবং নোড / এনপিএম কোনও ভাষা বা টুলচেন নয় যা আমি সাধারণত ব্যবহার করতে, অবদান রাখতে বা ব্যবহারের জন্য উত্সাহিত করতে চাই ।
amcgregor

ঠিক আছে অ্যামজারগার, আমি যখন কেবল সাহায্য করার চেষ্টা করছিলাম তখন আপনি আমার কাছে বেশ নেতিবাচক হচ্ছেন। আমি এনএমপি ভুল পথে চালিত হয়েছে এর সাথে একমত। আপনার স্ট্যাকের ওভারফ্লো উত্তরটি ভবিষ্যতে একটি ছোট ঝাঁকনি দিয়ে হাজির হয়েছে Ima আমি, আপনার গ্রন্থাগারটি ব্যবহার করে বিকাশকারী হিসাবে, কেবলমাত্র আপগ্রেড করব এবং আমি আরও সঠিক আচরণ পাব। পরিবর্তে, আমাকে .... ভাঙা আচরণের সাথে বাঁচতে হবে বা আপনার সম্পাদনাগুলি পেতে এই স্ট্যাকের ওভারফ্লো উত্তরটি পুনরায় দেখতে হবে? এটি বিকল্প মহাবিশ্ব
কলিন ডি

নেতিবাচক? আমি আমার অবস্থানটি ব্যাখ্যা করছিলাম এবং আমি কেন এমন করবো না যা অন্যথায় একটি বুদ্ধিমান জিনিস বলে মনে হয়। দ্রষ্টব্য, তবে যে নিবন্ধটি আমি সংযুক্ত করেছি সেটি হ'ল প্রথমে কিছুটা প্রদাহজনক (সংযুক্ত আপ-ফ্রন্ট) ফলো-অন ছিল যা প্রচুর আলোচনার জন্ম দিয়েছে। তিনি একটি প্রযুক্তিগত কাগজ প্রকাশ করেছিলেন , সেখানেও যুক্ত ছিলেন, নীচের দিকে। আমি গুণমান সম্পর্কে প্রমাণ সঙ্গে পুনরায় কাজ সম্পর্কে আপনার অন্ত্র অনুভূতি প্রতিরোধ। সূত্র: §7.2 (& বাঁ-প্যাড দুর্যোগ ও eslint)
amcgregor
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.