2009-11-09 17 views
10

क्या नियमित अभिव्यक्ति है जो पूरी तरह से HTML टैग को हटा सकती है? वैसे, मैं जावा का उपयोग कर रहा हूं।जावा में HTML टैग को कैसे हटाएं

+2

खोज बॉक्स में अपने शीर्षक टाइप करना, मैं निम्नलिखित है: http://stackoverflow.com/search?q=How+to+remove+HTML+tag + जावा में ... क्या आप सवाल पोस्ट करते समय वही नहीं मिला? – kdgregory

+2

मुझे कोई डुप्लिकेट नहीं मिला। ये प्रश्न HTML से टेक्स्ट निकालने की परवाह करते हैं: http://stackoverflow.com/questions/240546/removing-html-from-a-java-string http: // stackoverflow।कॉम/प्रश्न/832620/स्ट्रिपिंग-एचटीएमएल-टैग-इन-जावा – tangens

उत्तर

20

आपको इसके बजाय एक HTML पार्सर का उपयोग करना चाहिए। मुझे htmlCleaner पसंद है, क्योंकि यह मुझे HTML का एक सुंदर मुद्रित संस्करण देता है।

htmlCleaner के साथ आप कर सकते हैं:

TagNode root = htmlCleaner.clean(stream); 
Object[] found = root.evaluateXPath("//div[id='something']"); 
if(found.length > 0 && found instanceof TagNode) { 
    ((TagNode)found[0]).removeFromTree(); 
} 
+0

मुझे HTMLCleaner को इंगित करने के लिए धन्यवाद :) – exhuma

+0

क्या हमें इस उपरोक्त कोड का उपयोग करने के लिए किसी भी लाइब्रेरी को क्रम में प्राप्त करने की आवश्यकता है? और root.evaluateXPath ("// div [id = 'something']"); इस "कुछ" में कोई आईडी अनुष्ठान हो सकता है? कृपया मुझे बताओ। धन्यवाद –

4

सं रेगुलर एक्सप्रेशन परिभाषा पार्स एचटीएमएल से नहीं कर सकते।

आप s/<[^>]*\>// पर रीगेक्स का उपयोग कर सकते हैं या ऐसा कुछ बेवकूफ़ बना सकते हैं लेकिन यह अपर्याप्त होगा, खासकर अगर आप टैग की सामग्री को हटाने में रुचि रखते हैं।

जैसा कि एक अन्य पोस्टर ने कहा, एक वास्तविक HTML पार्सर का उपयोग करें।

4

तुम सिर्फ टैग हटाने की जरूरत है, तो आप इस रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

content = content.replaceAll("<[^>]+>", ""); 

यह केवल टैग अन्य HTML सामान निकाल देंगे, लेकिन नहीं। अधिक जटिल चीजों के लिए आपको पार्सर का उपयोग करना चाहिए।

संपादित: HTML के साथ समस्याओं से बचने के टिप्पणी आप निम्न कर सकते हैं:

content = content.replaceAll("<!--.*?-->", "").replaceAll("<[^>]+>", ""); 
+0

चूंकि आप मांस के किसी भी अक्षर '.', '^' और '$' का उपयोग नहीं करते हैं, इसलिए 's' और' m' झंडे को छोड़ा जा सकता है। –

+0

यह रेगेक्स मैंगलिंग का कारण बनने के लिए उत्तरदायी है यदि HTML में एम्बेडेड '<' or '>' वर्णों के साथ XML टिप्पणियां हैं। –

0

वैकल्पिक रूप से, अगर आपके इरादे प्रदर्शित करने के लिए उपयोगकर्ता नियंत्रित इनपुट वापस ग्राहक के लिए है, तो आप भी कर सकते हैं बस <&lt; और सभी >&gt; द्वारा प्रतिस्थापित करें। इस तरह एचटीएमएल का अर्थ क्लाइंट के आवेदन (वेबब्रोसर) द्वारा नहीं किया जाएगा।

यदि आप जेएसपी का उपयोग तकनीक के रूप में कर रहे हैं, तो आप इसके लिए जेएसटीएल के c:out का उपयोग कर सकते हैं। यह डिफ़ॉल्ट रूप से सभी HTML इकाइयों से बच जाएगा। तो उदाहरण के लिए

<c:out value="<script>alert('XSS');</script>" /> 

अलर्ट प्रदर्शित नहीं करेगा, लेकिन केवल वास्तविक स्ट्रिंग दिखाएं।

0

आप सभी html टैग हटाने के लिए इस सरल कोड का उपयोग कर सकते हैं ...

htmlString.replaceAll("\\<.*?\\>", "")) 
+1

यह केवल उद्घाटन टैग को हटा देगा और बंद टैग को अनचाहे छोड़ देगा। – jlordo

+0

मैं इस तरह की नौकरी कभी नहीं करूंगा - सादे-पाठ में पार्सिंग एचटीएमएल सचमुच नौकरी दोस्त है .. – jebbie

+0

यह मेरे लिए काम करता है लेकिन शायद टैग, टिप्पणियां, स्क्रिप्ट आदि की जटिलता पर निर्भर करता है। तो, एक जटिल मामले के लिए शायद एक एचटीएमएल पुस्तकालय बेहतर होना चाहिए। – jmoran

16

वहाँ JSoup जो एक जावा एचटीएमएल हेरफेर के लिए बनाया पुस्तकालय है। clean() विधि और WhiteList ऑब्जेक्ट को देखें। समाधान का उपयोग करने में आसान है!

+2

वाह, आप महोदय, वास्तव में मेरा दिन बना दिया, मुझे वह पसंद है, हाँ! Markdownj, Markdown4J, htmlCleaner .. उनमें से सभी ***** क्षमा चाहते हैं .. JSoup एकमात्र है और केवल एक ही लाइनर के साथ आप वास्तव में इसे प्राप्त करते हैं: स्ट्रिंग सादा = नया HTML ToPlainText()। GetPlainText (Jsoup.parse (एचटीएमएल)); – jebbie

+4

एक छोटा कोड 'स्ट्रिंग plaintext = jsoup.parse (html) .text(); ' – jrarama

+2

@jrarama - बिलकुल नहीं होगा। 'Jsoup.parse (html) .text()' सभी टैग और व्हाइटस्पेस को हटा दें, आपको केवल टेक्स्ट की एक लंबी पंक्ति के साथ छोड़ दें, जबकि 'नया HTMLToPlainText()। GetPlainText (Jsoup.parse (html))' प्रारूप एक सरल तरीके से पाठ, लाइन ब्रेक, पैराग्राफ, बुलेट पॉइंट इत्यादि रखते हुए। – isapir

1

आपको किसी भी HTML पार्सर की आवश्यकता नहीं है। नीचे दिए गए कोड सभी HTML टिप्पणियों को हटा:

htmlString = htmlString.replaceAll("(?s)<!--.*?-->", "");

संबंधित मुद्दे