HTML को Text JavaScript से Strip करें


655

क्या जावास्क्रिप्ट में html की एक स्ट्रिंग लेने और html को बाहर निकालने का एक आसान तरीका है?

जवाबों:


760

यदि आप किसी ब्राउज़र में चल रहे हैं, तो सबसे आसान तरीका यह है कि ब्राउज़र को आपके लिए करने दें ...

function stripHtml(html)
{
   var tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

नोट: जैसा कि लोगों ने टिप्पणियों में नोट किया है, यह सबसे अच्छा है यदि आप HTML के स्रोत को नियंत्रित नहीं करते हैं (उदाहरण के लिए, उपयोगकर्ता इनपुट से आ सकने वाली किसी भी चीज़ पर इसे न चलाएं)। उन परिदृश्यों के लिए, आप अभी भी ब्राउज़र को आपके लिए काम करने दे सकते हैं - अब व्यापक रूप से उपलब्ध DOMParser का उपयोग करने पर सबा का जवाब देखें


40
बस याद रखें कि यह दृष्टिकोण असंगत है और कुछ ब्राउज़रों में कुछ वर्णों को छीनने में विफल होगा। उदाहरण के लिए, Prototyp.js में, हम प्रदर्शन के लिए इस दृष्टिकोण का उपयोग करते हैं, लेकिन कुछ कमियों के आसपास काम करते हैं - github.com/kangax/prototype/blob/…
kangax

11
याद रखें आपके व्हाट्सएप के बारे में गड़बड़ होगी। मैं इस पद्धति का उपयोग करता था, और फिर कुछ उत्पाद कोड के रूप में समस्याएं होती थीं, जिसमें डबल रिक्त स्थान होते थे, जो कि मुझे DIV से इनरटेक्स्ट वापस मिलने के बाद एकल रिक्त स्थान के रूप में समाप्त हो गया था। तब उत्पाद कोड आवेदन में बाद में मेल नहीं खाते थे।
मैग्नस स्मिथ

11
@ मैग्नस स्मिथ: हां, अगर व्हाट्सएप एक चिंता का विषय है - या वास्तव में, अगर आपको इस पाठ की कोई आवश्यकता है जो सीधे आपके द्वारा काम कर रहे विशिष्ट HTML डोम को शामिल नहीं करता है - तो आप दूसरे में से किसी एक का उपयोग करके बेहतर हैं यहाँ दिए गए समाधान। इस पद्धति का प्राथमिक लाभ यह है कि यह 1) तुच्छ है, और 2) मज़बूती से टैग, व्हाट्सएप, एंटिटीज़, कमेंट्स आदि को उसी तरह प्रोसेस करेगा, जैसे आप जिस ब्राउज़र में चला रहे हैं । यह वेब क्लाइंट कोड के लिए अक्सर उपयोगी होता है, लेकिन अन्य प्रणालियों के साथ बातचीत करने के लिए आवश्यक नहीं है जहां नियम भिन्न हैं।
शोग

220
HTML का उपयोग किसी अविश्वसनीय स्रोत से न करें। यह देखने के लिए, रनिंग करने की कोशिश करेंstrip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
माइक सैमुअल

24
यदि HTML में छवियाँ (img टैग) हैं, तो छवियों को ब्राउज़र द्वारा अनुरोध किया जाएगा। यह अच्छा नहीं है।
douyw

589
myString.replace(/<[^>]*>?/gm, '');

4
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)" यदि आप इंजेक्शन के माध्यम से document.writeया एक स्ट्रिंग के साथ समाप्‍त कर रहे हैं तो काम नहीं करता है, जिसमें >इंजेक्शन लगाने से पहले हो innerHTML
माइक सैमुअल 15

1
@PerishableDave, मैं मानता हूं कि >वसीयत को दूसरे में छोड़ दिया जाएगा। हालांकि यह एक इंजेक्शन खतरा नहीं है। <पहले में बाएं के कारण खतरा होता है , जो दूसरे के शुरू होने पर HTML पार्सर को डेटा स्थिति के अलावा किसी अन्य संदर्भ में होने का कारण बनता है । ध्यान दें कि डेटा स्थिति से कोई संक्रमण नहीं है >
माइक सैम्युअल

73
@ मायकेसमुएल क्या हमने इस जवाब पर अभी तक निर्णय लिया है? यहाँ उपयोगकर्ता को कॉपी-पेस्ट के लिए तैयार करते हैं।
जिग्गी

1
यह भी, मेरा मानना ​​है कि अगर <button onClick="dostuff('>');"></button>HTML को सही तरीके से लिखा गया मान लिया जाए, तो आप पूरी तरह से भ्रमित हो जाते हैं , फिर भी आपको इस बात का ध्यान रखना होगा कि एक विशेषता में उद्धृत पाठ में साइन से बड़ा हिस्सा कहीं हो सकता है। इसके अलावा <script>, आप कम से कम टैग के अंदर के सभी पाठ को निकालना चाहेंगे ।
जोनाथन

15
@AntonioMax, मैं इस प्रश्न का उत्तर दिया बारंबार , लेकिन अपने प्रश्न का पदार्थ है, क्योंकि सुरक्षा बहुत ज़रूरी कोड नहीं की नकल की और चिपकाया जाना चाहिए। आपको एक पुस्तकालय डाउनलोड करना चाहिए, और इसे अद्यतित रखना चाहिए और पैच किया जाना चाहिए ताकि आप हाल ही में खोजी गई कमजोरियों और ब्राउज़रों में परिवर्तन के खिलाफ सुरक्षित रहें।
माइक सैमुअल

249

सबसे सरल तरीका:

jQuery(html).text();

यह html के एक स्ट्रिंग से सभी पाठ को पुनः प्राप्त करता है।


111
हम हमेशा परियोजनाओं के लिए jQuery का उपयोग करते हैं, क्योंकि हमारी परियोजनाओं में जावास्क्रिप्ट बहुत सारे हैं। इसलिए हमने बल्क नहीं जोड़ा, हमने मौजूदा एपीआई कोड का फायदा उठाया ...
मार्क

32
आप इसका इस्तेमाल करते हैं, लेकिन ओपी शायद नहीं। सवाल जावास्क्रिप्ट नहीं JQuery के बारे में था।
दैविक

105
यह अभी भी उन लोगों के लिए एक उपयोगी उत्तर है, जिन्हें ओपी (मेरी तरह) के समान काम करने की आवश्यकता है और jQuery का उपयोग करने में कोई आपत्ति नहीं है (मेरे जैसे), उल्लेख नहीं करने के लिए, यह ओपी के लिए उपयोगी हो सकता था यदि वे उपयोग करने पर विचार कर रहे थे jQuery। साइट का बिंदु ज्ञान साझा करना है। ध्यान रखें कि अच्छे कारणों के बिना उपयोगी उत्तरों का पीछा करने से आपको होने वाले द्रुतशीतन प्रभाव पड़ सकते हैं।
अजय

27
@ अनिश्चित रूप से, मुझे लगता है कि कई उत्तर वाले धागे सबसे उपयोगी होंगे, क्योंकि अक्सर एक माध्यमिक उत्तर मेरी सटीक जरूरतों को पूरा करता है, जबकि प्राथमिक उत्तर सामान्य मामले से मिलता है।
एरिक गोल्डबर्ग

36
अगर आप स्ट्रिंग का कुछ हिस्सा html टैग में नहीं लपेटेंगे तो यह काम नहीं करेगा। उदाहरण के लिए "<b> त्रुटि: </ b> कृपया एक वैध ईमेल दर्ज करें" केवल "त्रुटि:" वापस आ जाएगी
आमिर अफरीदी

127

मैं शोग 9 के स्वीकृत उत्तर का एक संपादित संस्करण साझा करना चाहूंगा ।


जैसा कि माइक सैमुअल ने एक टिप्पणी के साथ बताया, वह फ़ंक्शन इनलाइन जावास्क्रिप्ट कोड निष्पादित कर सकता है।
लेकिन शोग 9 सही है जब कह रहा है "ब्राउज़र को आपके लिए करने दें ..."

तो .. यहाँ मेरा संपादित संस्करण, DOMParser का उपयोग कर :

function strip(html){
   var doc = new DOMParser().parseFromString(html, 'text/html');
   return doc.body.textContent || "";
}

यहाँ इनलाइन जावास्क्रिप्ट का परीक्षण करने के लिए कोड है:

strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")

इसके अलावा, यह पार्स पर संसाधनों का अनुरोध नहीं करता है (छवियों की तरह)

strip("Just text <img src='https://assets.rbl.ms/4155638/980x.jpg'>")

3
यह जोड़ने योग्य है कि यह समाधान केवल ब्राउज़र में काम करता है।
kris_IV

1
यह स्ट्रिप टैग नहीं है, लेकिन PHP htmlspecialchars () की तरह अधिक है। फिर भी मेरे लिए उपयोगी है।
दंताजे

ध्यान दें कि यह पाठ की शुरुआत से व्हाट्सएप को भी हटा देता है।
रीन रेवरे

यह भी ध्यान दें, यह वेब वर्कर्स में काम करता है
क्रिस सेफ़र्ट

यह @ शोग 9 के उत्तर से अधिक तेज प्रतीत होता है
शमूएल कामेंस्की

55

JQuery पद्धति के विस्तार के रूप में, यदि आपके स्ट्रिंग में HTML नहीं हो सकता है (जैसे यदि आप HTML को फ़ॉर्म फ़ील्ड से निकालने का प्रयास कर रहे हैं)

jQuery(html).text();`

यदि HTML नहीं है तो एक खाली स्ट्रिंग लौटाएगा

उपयोग:

jQuery('<p>' + html + '</p>').text();

बजाय।

अपडेट: जैसा कि टिप्पणियों में बताया गया है, कुछ परिस्थितियों में यह समाधान निहित जावास्क्रिप्ट को निष्पादित करेगा htmlयदि htmlकिसी हमलावर द्वारा मूल्य को प्रभावित किया जा सकता है, तो एक अलग समाधान का उपयोग करें।


12
या$("<p>").html(html).text();
दिमितर दिमित्रोव

4
यह अभी भी शायद खतरनाक कोड को अंजाम देता हैjQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
साइमन

jQuery का प्रयास करें ("आ & # X003c; स्क्रिप्ट> अलर्ट (1) और # X003c; स्क्रिप्ट / ए")। पाठ ();
ग्रेजेगर्ज़ काकज़न

41

हाइपरलिंक (एक href) बरकरार रखते हुए सादे पाठ ईमेल के लिए HTML परिवर्तित

हाइपोक्साइड द्वारा पोस्ट किया गया उपरोक्त फ़ंक्शन ठीक काम करता है, लेकिन मैं कुछ ऐसा था जो मूल रूप से HTML को वेब रिचटेक्स्ट एडिटर में बनाया गया था (उदाहरण के लिए FCKEditor) और सभी HTML को हटा दें, लेकिन इस तथ्य के कारण सभी लिंक छोड़ दें कि मुझे दोनों HTML चाहिए थे सादे टेक्स्ट संस्करण एक STMP ईमेल (HTML और सादे पाठ दोनों) के लिए सही हिस्से बनाने में सहायता करने के लिए।

Google को खोज करने के लंबे समय के बाद और जावास्क्रिप्ट में regex इंजन का उपयोग करके मेरे और मेरे कोलेजियम इस पर आए:

str='this string has <i>html</i> code i want to <b>remove</b><br>Link Number 1 -><a href="http://www.bbc.co.uk">BBC</a> Link Number 1<br><p>Now back to normal text and stuff</p>
';
str=str.replace(/<br>/gi, "\n");
str=str.replace(/<p.*>/gi, "\n");
str=str.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 (Link->$1) ");
str=str.replace(/<(?:.|\s)*?>/g, "");

strचर इस तरह से शुरू होती है:

this string has <i>html</i> code i want to <b>remove</b><br>Link Number 1 -><a href="http://www.bbc.co.uk">BBC</a> Link Number 1<br><p>Now back to normal text and stuff</p>

और फिर कोड चलने के बाद ऐसा दिखता है: -

this string has html code i want to remove
Link Number 1 -> BBC (Link->http://www.bbc.co.uk)  Link Number 1


Now back to normal text and stuff

जैसा कि आप देख सकते हैं कि सभी HTML हटा दिए गए हैं और लिंक को हाइपरलिंक किए गए पाठ के साथ जारी रखा गया है। इसके अलावा मैंने <p>और <br>टैग को बदल दिया है\n (न्यूलाइन चार) के ताकि किसी प्रकार के दृश्य स्वरूपण को बनाए रखा जा सके।

लिंक प्रारूप को बदलने के लिए (उदाहरण के लिए BBC (Link->http://www.bbc.co.uk)) बस संपादित करें $2 (Link->$1), जहां $1href URL / URI है और $2हाइपरलिंक पाठ है। सादे पाठ के शरीर में सीधे लिंक के साथ अधिकांश एसएमटीपी मेल ग्राहक इन्हें परिवर्तित करते हैं, इसलिए उपयोगकर्ता के पास इन पर क्लिक करने की क्षमता होती है।

उम्मीद है कि आपके लिए यह उपयोगी रहे।


यह "& nbsp;" को हैंडल नहीं करता है
रोज नेटॉययूर

33

स्वीकृत उत्तर में सुधार।

function strip(html)
{
   var tmp = document.implementation.createHTMLDocument("New").body;
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

इस तरह से कुछ इस तरह से चलने से कोई नुकसान नहीं होगा:

strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")

फ़ायरफ़ॉक्स, क्रोमियम और एक्सप्लोरर 9+ सुरक्षित हैं। ओपेरा प्रेस्टो अभी भी असुरक्षित है। इसके अलावा स्ट्रिंग्स में उल्लिखित छवियां क्रोमियम और फ़ायरफ़ॉक्स में http अनुरोधों को सहेजने के लिए डाउनलोड नहीं की जाती हैं।


यह वहाँ जिस तरह से कुछ है, लेकिन नहीं से सुरक्षित है<script><script>alert();
अर्थ

1
लिनक्स पर क्रोमियम / ओपेरा / फ़ायरफ़ॉक्स में यहाँ कोई स्क्रिप्ट नहीं चलती है, तो यह सुरक्षित क्यों नहीं है?
जांघो

मेरी क्षमायाचना, मुझे मिस-टेस्टेड होना चाहिए, मैं शायद jsFiddle पर फिर से रन क्लिक करना भूल गया।
आर्थर

मुझे लगता है कि "नया" तर्क बहुत ही कम है?
जॉन श्नाइडर

ऐनक के अनुसार यह आजकल वैकल्पिक है, लेकिन यह हमेशा नहीं था।
जंघौ

23

यह किसी भी जावास्क्रिप्ट पर्यावरण (NodeJS शामिल) पर काम करना चाहिए।

const text = `
<html lang="en">
  <head>
    <style type="text/css">*{color:red}</style>
    <script>alert('hello')</script>
  </head>
  <body><b>This is some text</b><br/><body>
</html>`;

// Remove style tags and content
text.replace(/<style[^>]*>.*<\/style>/gm, '')
    // Remove script tags and content
    .replace(/<script[^>]*>.*<\/script>/gm, '')
    // Remove all opening, closing and orphan HTML tags
    .replace(/<[^>]+>/gm, '')
    // Remove leading spaces and repeated CR/LF
    .replace(/([\r\n]+ +)+/gm, '');

@ स्टेटस्टोन क्या आप अपने कथन का एक कार्यशील उदाहरण दे सकते हैं?
कार्ल

3
<html><style..>* {font-family:comic-sans;}</style>Some Text</html>
pstanton

@pstanton मैंने कोड तय किया है और टिप्पणी को जोड़ा है, देर से प्रतिक्रिया के लिए क्षमा करें।
कार्ल।

15

मैं बदल Jibberboy2000 का जवाब कई शामिल करने के लिए <BR />टैग प्रारूपों, निकालें सब कुछ अंदर <SCRIPT>और<STYLE> टैग को हटाने, कई लाइन ब्रेक और रिक्त स्थान को हटाने के परिणामस्वरूप HTML को प्रारूपित करने और कुछ HTML-एन्कोड किए गए कोड को सामान्य में बदलने के । कुछ परीक्षण के बाद ऐसा प्रतीत होता है कि आप अधिकांश पूर्ण वेब पृष्ठों को सरल पाठ में बदल सकते हैं जहाँ पृष्ठ शीर्षक और सामग्री बरकरार रहती है।

सरल उदाहरण में,

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<!--comment-->

<head>

<title>This is my title</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>

    body {margin-top: 15px;}
    a { color: #D80C1F; font-weight:bold; text-decoration:none; }

</style>
</head>

<body>
    <center>
        This string has <i>html</i> code i want to <b>remove</b><br>
        In this line <a href="http://www.bbc.co.uk">BBC</a> with link is mentioned.<br/>Now back to &quot;normal text&quot; and stuff using &lt;html encoding&gt;                 
    </center>
</body>
</html>

हो जाता है

यह मेरा शीर्षक है

इस स्ट्रिंग में html कोड है जिसे मैं हटाना चाहता हूं

इस पंक्ति में लिंक के साथ बीबीसी ( http://www.bbc.co.uk ) का उल्लेख है।

अब वापस "सामान्य पाठ" और सामान का उपयोग कर

जावास्क्रिप्ट फ़ंक्शन और परीक्षण पृष्ठ इसे देखते हैं:

function convertHtmlToText() {
    var inputText = document.getElementById("input").value;
    var returnText = "" + inputText;

    //-- remove BR tags and replace them with line break
    returnText=returnText.replace(/<br>/gi, "\n");
    returnText=returnText.replace(/<br\s\/>/gi, "\n");
    returnText=returnText.replace(/<br\/>/gi, "\n");

    //-- remove P and A tags but preserve what's inside of them
    returnText=returnText.replace(/<p.*>/gi, "\n");
    returnText=returnText.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 ($1)");

    //-- remove all inside SCRIPT and STYLE tags
    returnText=returnText.replace(/<script.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/script>/gi, "");
    returnText=returnText.replace(/<style.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/style>/gi, "");
    //-- remove all else
    returnText=returnText.replace(/<(?:.|\s)*?>/g, "");

    //-- get rid of more than 2 multiple line breaks:
    returnText=returnText.replace(/(?:(?:\r\n|\r|\n)\s*){2,}/gim, "\n\n");

    //-- get rid of more than 2 spaces:
    returnText = returnText.replace(/ +(?= )/g,'');

    //-- get rid of html-encoded characters:
    returnText=returnText.replace(/&nbsp;/gi," ");
    returnText=returnText.replace(/&amp;/gi,"&");
    returnText=returnText.replace(/&quot;/gi,'"');
    returnText=returnText.replace(/&lt;/gi,'<');
    returnText=returnText.replace(/&gt;/gi,'>');

    //-- return
    document.getElementById("output").value = returnText;
}

यह इस HTML के साथ प्रयोग किया गया था:

<textarea id="input" style="width: 400px; height: 300px;"></textarea><br />
<button onclick="convertHtmlToText()">CONVERT</button><br />
<textarea id="output" style="width: 400px; height: 300px;"></textarea><br />

1
मुझे यह समाधान पसंद है क्योंकि इसमें html विशेष वर्णों का उपचार है ... लेकिन अभी भी उनमें से लगभग पर्याप्त नहीं है ... मेरे लिए सबसे अच्छा उत्तर उन सभी के साथ व्यवहार करेगा। (जो शायद jquery करता है)।
डैनियल गेरसन

2
मुझे लगता है कि /<p.*>/giहोना चाहिए /<p.*?>/gi
cbron

ध्यान दें कि सभी <br>टैग को हटाने के लिए आप इसके बजाय एक अच्छी नियमित अभिव्यक्ति का उपयोग कर सकते हैं: /<br\s*\/?>/इस तरह से आपके पास केवल 3 के बजाय एक जगह है। इसके अलावा, यह मुझे भी लगता है कि संस्थाओं के डिकोडिंग के अलावा आपके पास एक एकल रेगेक्स हो सकता है, कुछ इस तरह से /<[a-z].*?\/?>/:।
एलेक्सिस विलके

अच्छी स्क्रिप्ट है। लेकिन टेबल कंटेंट का क्या? किसी भी विचार को कैसे प्रदर्शित किया जा सकता है
हिस्टोरो एनव


15
var text = html.replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g, "");

यह एक रेगेक्स संस्करण है, जो विकृत HTML के लिए अधिक लचीला है, जैसे:

अनछुए टैग

Some text <img

"<", ">" टैग विशेषताओं के अंदर

Some text <img alt="x > y">

नई-पंक्तियों

Some <a href="http://google.com">

कोड

var html = '<br>This <img alt="a>b" \r\n src="a_b.gif" />is > \nmy<>< > <a>"text"</a'
var text = html.replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g, "");

7

दुसरा, नीज़ या शोग 9 की तुलना में, कम सुरुचिपूर्ण समाधान, पुनरावृत्ति से चलना होगा <body> टैग पर शुरू होने वाले DOM को फिर से चलना और प्रत्येक टेक्स्ट नोड को जोड़ना।

var bodyContent = document.getElementsByTagName('body')[0];
var result = appendTextNodes(bodyContent);

function appendTextNodes(element) {
    var text = '';

    // Loop through the childNodes of the passed in element
    for (var i = 0, len = element.childNodes.length; i < len; i++) {
        // Get a reference to the current child
        var node = element.childNodes[i];
        // Append the node's value if it's a text node
        if (node.nodeType == 3) {
            text += node.nodeValue;
        }
        // Recurse through the node's children, if there are any
        if (node.childNodes.length > 0) {
            appendTextNodes(node);
        }
    }
    // Return the final result
    return text;
}

3
उफ़। यदि आप अपने स्ट्रिंग से एक डोम ट्री बनाने जा रहे हैं, तो बस शोग के रास्ते का उपयोग करें!
nickf

हां, मेरा समाधान एक स्लेज-हथौड़ा पैदा करता है जहां एक नियमित हथौड़ा अधिक उपयुक्त है :-)। और मैं मानता हूं कि आपका और शोग 9 का समाधान बेहतर है, और मूल रूप से उत्तर में उतना ही कहा गया है। मैं अपनी प्रतिक्रिया में यह भी प्रतिबिंबित करने में विफल रहा कि html पहले से ही एक स्ट्रिंग में समाहित है, मूल प्रश्न के संबंध में वैसे भी मेरे उत्तर को अनिवार्य रूप से बेकार बता रहा है। :-(
ब्रायन

1
निष्पक्ष होने के लिए, इसका मूल्य है - यदि आपको पूरी तरह से / सभी / पाठ का संरक्षण करना चाहिए, तो इसमें कम से कम एक नई गोली, टैब, गाड़ी के रिटर्न इत्यादि पर कब्जा करने के लिए एक अच्छा शॉट है ... फिर, फिर से, निकफ का समाधान भी करना चाहिए। , और बहुत तेज करो ... अह।
शोग

7

यदि आप लिंक और कंटेंट की संरचना (h1, h2, आदि) को रखना चाहते हैं तो आपको TextVersionJS को देखना चाहिए। आप इसे किसी भी HTML के साथ उपयोग कर सकते हैं, हालाँकि इसे HTML ईमेल को सादे टेक्स्ट में बदलने के लिए बनाया गया था।

उपयोग बहुत सरल है। नोड में उदाहरण के लिए। Js:

var createTextVersion = require("textversionjs");
var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";

var textVersion = createTextVersion(yourHtml);

या शुद्ध js वाले ब्राउज़र में:

<script src="textversion.js"></script>
<script>
  var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
  var textVersion = createTextVersion(yourHtml);
</script>

यह आवश्यकता के साथ भी काम करता है ।js:

define(["textversionjs"], function(createTextVersion) {
  var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
  var textVersion = createTextVersion(yourHtml);
});

4

उन सभी उत्तरों की कोशिश करने के बाद, जिनमें से सभी में किनारे के मामले नहीं थे और पूरी तरह से मेरी जरूरतों का समर्थन नहीं कर सकते थे।

मैंने यह पता लगाना शुरू कर दिया कि php यह कैसे करता है और php.js lib में आया है जो कि यहां strip_tags विधि की प्रतिकृति देता है: http://phpjs.org/functions/strip_tags/


यह एक साफ-सुथरा कार्य है और अच्छी तरह से प्रलेखित है। हालाँकि, इसे तेजी से बनाया जा सकता है जब allowed == ''मुझे लगता है कि ओपी ने जो पूछा है, वह लगभग यही है जो बायरन ने नीचे उत्तर दिया (बायरन केवल [^>]गलत है।)
एलेक्सिस विलके

1
यदि आप allowedपरम का उपयोग करते हैं तो आप XSS के लिए असुरक्षित हैं: stripTags('<p onclick="alert(1)">mytext</p>', '<p>')रिटर्न<p onclick="alert(1)">mytext</p>
क्रिस सिनेली

4
function stripHTML(my_string){
    var charArr   = my_string.split(''),
        resultArr = [],
        htmlZone  = 0,
        quoteZone = 0;
    for( x=0; x < charArr.length; x++ ){
     switch( charArr[x] + htmlZone + quoteZone ){
       case "<00" : htmlZone  = 1;break;
       case ">10" : htmlZone  = 0;resultArr.push(' ');break;
       case '"10' : quoteZone = 1;break;
       case "'10" : quoteZone = 2;break;
       case '"11' : 
       case "'12" : quoteZone = 0;break;
       default    : if(!htmlZone){ resultArr.push(charArr[x]); }
     }
    }
    return resultArr.join('');
}

अंदर विशेषताओं के लिए और <img onerror="javascript">नए बनाए गए डोम तत्वों में खाते ।

उपयोग:

clean_string = stripHTML("string with <html> in it")

डेमो:

https://jsfiddle.net/gaby_de_wilde/pqayphzd/

भयानक काम करने वाले शीर्ष उत्तर का डेमो:

https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/


आपको एक विशेषता मान (जैसे string with <a malicious="attribute \">this text should be removed, but is not">example</a>) के अंदर बच गए उद्धरणों को संभालने की आवश्यकता होगी ।
लोगन पिकअप

4

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

function removeTags(string, array){
  return array ? string.split("<").filter(function(val){ return f(array, val); }).map(function(val){ return f(array, val); }).join("") : string.split("<").map(function(d){ return d.split(">").pop(); }).join("");
  function f(array, value){
    return array.map(function(d){ return value.includes(d + ">"); }).indexOf(true) != -1 ? "<" + value : value.split(">")[1];
  }
}

var x = "<span><i>Hello</i> <b>world</b>!</span>";
console.log(removeTags(x)); // Hello world!
console.log(removeTags(x, ["span", "i"])); // <span><i>Hello</i> world!</span>

3

मुझे लगता है कि सबसे आसान तरीका सिर्फ रेगुलर एक्सप्रेशंस का उपयोग करना है जैसा कि ऊपर किसी ने बताया है। हालांकि उनमें से एक गुच्छा का उपयोग करने का कोई कारण नहीं है। प्रयत्न:

stringWithHTML = stringWithHTML.replace(/<\/?[a-z][a-z0-9]*[^<>]*>/ig, "");

11
यदि आप सुरक्षा का ध्यान रखते हैं तो ऐसा न करें। यदि उपयोगकर्ता इनपुट यह है: '<scr <script> ipt> alert (42); </ scr </ script> ipt>' तो छीन लिया संस्करण यह होगा: '<script> सतर्क (42); </ script > '। तो यह एक XSS भेद्यता है।
मोलनरग

आपको इसके [^<>]साथ बदलना चाहिए [^>]क्योंकि एक वैध टैग में एक <वर्ण शामिल नहीं हो सकता है , फिर XSS भेद्यता गायब हो जाती है।
एलेक्सिस विलके

3

मैंने मूल Jibberboy2000 स्क्रिप्ट में कुछ संशोधन किए हैं। आशा है कि यह किसी के लिए उपयोगी होगा

str = '**ANY HTML CONTENT HERE**';

str=str.replace(/<\s*br\/*>/gi, "\n");
str=str.replace(/<\s*a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 (Link->$1) ");
str=str.replace(/<\s*\/*.+?>/ig, "\n");
str=str.replace(/ {2,}/gi, " ");
str=str.replace(/\n+\s*/gi, "\n\n");

3

यहाँ एक संस्करण है जो Sorta @ माइकसमुएल की सुरक्षा चिंता का समाधान करता है:

function strip(html)
{
   try {
       var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
       doc.documentElement.innerHTML = html;
       return doc.documentElement.textContent||doc.documentElement.innerText;
   } catch(e) {
       return "";
   }
}

ध्यान दें, यह खाली स्ट्रिंग लौटाएगा यदि HTML मार्कअप वैध XML (उर्फ, टैग बंद नहीं होना चाहिए और विशेषताओं को उद्धृत किया जाना चाहिए)। यह आदर्श नहीं है, लेकिन सुरक्षा शोषण क्षमता होने के मुद्दे से बचता है।

यदि वैध XML मार्कअप नहीं होना आपके लिए एक आवश्यकता है, तो आप उपयोग करने का प्रयास कर सकते हैं:

var doc = document.implementation.createHTMLDocument("");

लेकिन यह अन्य कारणों से सही समाधान नहीं है।


यदि उपयोगकर्ता इनपुट (textarea या contenteditable widget ...) से पाठ आता है, तो यह कई परिस्थितियों में विफल हो जाएगा
एलेक्सिस विलके

3

आप iframe सैंडबॉक्स विशेषता का उपयोग करके HTML टैग्स को सुरक्षित रूप से पट्टी कर सकते हैं

विचार यहाँ बजाय हमारे स्ट्रिंग regex की कोशिश की है, हम एक डोम तत्व में पाठ इंजेक्शन लगाने और फिर पूछताछ की ब्राउज़र की देशी पार्सर का लाभ लेने कि है textContent/ innerTextउस तत्व की संपत्ति।

हमारे पाठ को इंजेक्ट करने के लिए सबसे उपयुक्त तत्व सैंडबॉक्स्ड इफ्रेम है, इस तरह हम किसी भी मनमाने कोड निष्पादन (जिसे XSS के रूप में भी जाना जाता है ) को रोक सकते हैं ।

इस दृष्टिकोण के नकारात्मक पक्ष यह है कि यह केवल ब्राउज़रों में काम करता है।

यहाँ मैं क्या लेकर आया हूँ (युद्ध-परीक्षण नहीं):

const stripHtmlTags = (() => {
  const sandbox = document.createElement("iframe");
  sandbox.sandbox = "allow-same-origin"; // <--- This is the key
  sandbox.style.setProperty("display", "none", "important");

  // Inject the sanbox in the current document
  document.body.appendChild(sandbox);

  // Get the sandbox's context
  const sanboxContext = sandbox.contentWindow.document;

  return (untrustedString) => {
    if (typeof untrustedString !== "string") return ""; 

    // Write the untrusted string in the iframe's body
    sanboxContext.open();
    sanboxContext.write(untrustedString);
    sanboxContext.close();

    // Get the string without html
    return sanboxContext.body.textContent || sanboxContext.body.innerText || "";
  };
})();

उपयोग ( डेमो ):

console.log(stripHtmlTags(`<img onerror='alert("could run arbitrary JS here")' src='bogus'>XSS injection :)`));
console.log(stripHtmlTags(`<script>alert("awdawd");</` + `script>Script tag injection :)`));
console.log(stripHtmlTags(`<strong>I am bold text</strong>`));
console.log(stripHtmlTags(`<html>I'm a HTML tag</html>`));
console.log(stripHtmlTags(`<body>I'm a body tag</body>`));
console.log(stripHtmlTags(`<head>I'm a head tag</head>`));
console.log(stripHtmlTags(null));

वेब आधारित वातावरण के लिए महान समाधान! आपको शायद एक IIFE का उपयोग नहीं करना चाहिए क्योंकि ECMAScript 2015 के बाद से, ब्लॉक-स्कूप किए गए चर पहले से ही letऔर constऑपरेटरों के साथ ब्लॉक में ठीक से स्कैन किए गए हैं । इसके अलावा, आपके समाधान का उपयोग करते हुए, मुझे iframesदस्तावेज़ के अंदर उपयोग नहीं किए जाने के बहुत सारे संदर्भ मिले । document.body.removeChild(sandbox)भविष्य के कॉपी-पास्ता आधारित पाठकों के लिए एक कोड जोड़ने पर विचार करें ।
अमीन NAIRI

2

JQuery के साथ आप बस इसका उपयोग करके पुनः प्राप्त कर सकते हैं

$('#elementID').text()

2

नीचे दिए गए कोड आपको अन्य सभी को अलग करते हुए कुछ html टैग बनाए रखने की अनुमति देते हैं

function strip_tags(input, allowed) {

  allowed = (((allowed || '') + '')
    .toLowerCase()
    .match(/<[a-z][a-z0-9]*>/g) || [])
    .join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)

  var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
      commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;

  return input.replace(commentsAndPhpTags, '')
      .replace(tags, function($0, $1) {
          return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
      });
}

1
आपको स्रोत ( phpjs) को उद्धृत करना चाहिए । यदि आप allowedपरम का उपयोग करते हैं तो आप XSS के प्रति असुरक्षित हैं: stripTags('<p onclick="alert(1)">mytext</p>', '<p>')रिटर्न<p onclick="alert(1)">mytext</p>
क्रिस सिनेली

2

शानदार htmlparser2 शुद्ध JS HTML पार्सर का उपयोग करना भी संभव है । यहाँ एक कार्यशील डेमो है:

var htmlparser = require('htmlparser2');

var body = '<p><div>This is </div>a <span>simple </span> <img src="test"></img>example.</p>';

var result = [];

var parser = new htmlparser.Parser({
    ontext: function(text){
        result.push(text);
    }
}, {decodeEntities: true});

parser.write(body);
parser.end();

result.join('');

आउटपुट होगा This is a simple example.

इसे यहां देखें: https://tonicdev.com/jfahrenkrug/extract-text-from-html

यह नोड और ब्राउज़र दोनों में काम करता है यदि आप वेबपैक जैसे टूल का उपयोग करके आपको वेब एप्लिकेशन पैक करते हैं।


2

मुझे सिर्फ स्ट्रिप आउट करने की जरूरत थी <a> टैग हटाने और लिंक के पाठ के साथ बदलने की ।

यह महान काम करने लगता है।

htmlContent= htmlContent.replace(/<a.*href="(.*?)">/g, '');
htmlContent= htmlContent.replace(/<\/a>/g, '');

यह केवल एक टैग के लिए लागू होता है और एक विस्तृत फ़ंक्शन होने के लिए ट्विकिंग की आवश्यकता होती है।
m3nda

हाँ, प्लस एंकर टैग में कई अन्य विशेषताएं हो सकती हैं जैसे कि title="..."
एलेक्सिस विलके


1

मैंने खुद एक नियमित अभिव्यक्ति बनाई है:

str=str.replace(/(<\?[a-z]*(\s[^>]*)?\?(>|$)|<!\[[a-z]*\[|\]\]>|<!DOCTYPE[^>]*?(>|$)|<!--[\s\S]*?(-->|$)|<[a-z?!\/]([a-z0-9_:.])*(\s[^>]*)?(>|$))/gi, ''); 

1

html को स्ट्रिप करने के लिए सरल 2 लाइन jquery।

 var content = "<p>checking the html source&nbsp;</p><p>&nbsp;
  </p><p>with&nbsp;</p><p>all</p><p>the html&nbsp;</p><p>content</p>";

 var text = $(content).text();//It gets you the plain text
 console.log(text);//check the data in your console

 cj("#text_area_id").val(text);//set your content to text area using text_area_id

1

स्वीकृत उत्तर अधिकतर ठीक काम करता है, हालाँकि IE में यदि htmlस्ट्रिंग nullआपको मिलती है "null"('' के बजाय)। फिक्स्ड:

function strip(html)
{
   if (html == null) return "";
   var tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

1

Jquery का उपयोग करना:

function stripTags() {
    return $('<p></p>').html(textToEscape).text()
}

1

inputतत्व केवल एक पंक्ति पाठ का समर्थन करते हैं :

पाठ राज्य तत्व के मूल्य के लिए एक पंक्ति सादे पाठ संपादित नियंत्रण का प्रतिनिधित्व करता है।

function stripHtml(str) {
  var tmp = document.createElement('input');
  tmp.value = str;
  return tmp.value;
}

अपडेट: यह उम्मीद के मुताबिक काम करता है

function stripHtml(str) {
  // Remove some tags
  str = str.replace(/<[^>]+>/gim, '');

  // Remove BB code
  str = str.replace(/\[(\w+)[^\]]*](.*?)\[\/\1]/g, '$2 ');

  // Remove html and line breaks
  const div = document.createElement('div');
  div.innerHTML = str;

  const input = document.createElement('input');
  input.value = div.textContent || div.innerText || '';

  return input.value;
}

काम नहीं करता है, कृपया उत्तर पोस्ट करते समय हमेशा उस ब्राउज़र का उल्लेख करें जिसका आप उपयोग कर रहे हैं। यह गलत है और क्रोम 61 में काम नहीं करेगा। टैग केवल एक स्ट्रिंग के रूप में प्रस्तुत किया गया है।
vdegenne

0
    (function($){
        $.html2text = function(html) {
            if($('#scratch_pad').length === 0) {
                $('<div id="lh_scratch"></div>').appendTo('body');  
            }
            return $('#scratch_pad').html(html).text();
        };

    })(jQuery);

इसे jquery प्लगइन के रूप में परिभाषित करें और इसे निम्नानुसार उपयोग करें:

$.html2text(htmlContent);

बता दें कि यह यूजर इनपुट से आता है। इसका उपयोग आपके पेज पर स्क्रिप्ट या मैक्रोज़ को जोड़ने के लिए किया जा सकता है
Oluwatumbi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.