স্ট্রিং থেকে এইচটিএমএল ট্যাগগুলি সরান


422

জাভা স্ট্রিং থেকে এইচটিএমএল সরানোর কোনও ভাল উপায় আছে কি? একটি সাধারণ রেজেক্স মত

 replaceAll("\\<.*?>","") 

কাজ করবে, তবে &amp;দুটি কোণের বন্ধনীগুলির মধ্যে সঠিকভাবে রূপান্তরিত হবে না এবং এইচটিএমএল-টি অপসারণ করা হবে (যেমন .*?রেজেক্সের মধ্যে অদৃশ্য হয়ে যাবে)।


2
নিম্নলিখিত গাইডের সাথে এটি ব্যবহার করুন: সংকলন করুন 'org.jsoup: jsoup: 1.9.2'
VahidHoseini


উত্তর:


572

রেজেক্সের পরিবর্তে এইচটিএমএল পার্সার ব্যবহার করুন। এটি জসুপের সাথে মরা সহজ ।

public static String html2text(String html) {
    return Jsoup.parse(html).text();
}

জসপ কাস্টমাইজযোগ্য শ্বেত তালিকাটির বিপরীতে এইচটিএমএল ট্যাগগুলি সরিয়েও সমর্থন করে , যা আপনি কেবলমাত্র যেমন <b>, <i>এবং <u>

আরো দেখুন:


18
জসুপ দুর্দান্ত, তবে আমি এটির সাথে কিছু ত্রুটিগুলির মুখোমুখি হয়েছি। আমি এক্সএসএস থেকে মুক্তি পাওয়ার জন্য এটি ব্যবহার করি, তাই মূলত আমি একটি সরল পাঠ্য ইনপুট আশা করি তবে কিছু দুষ্ট ব্যক্তি আমাকে কিছু এইচটিএমএল প্রেরণের চেষ্টা করতে পারে। জসুপ ব্যবহার করে, আমি সমস্ত এইচটিএমএল সরিয়ে ফেলতে পারি তবে দুর্ভাগ্যক্রমে এটি একের সাথে অনেকগুলি স্থান সঙ্কুচিত করে এবং লিঙ্ক ব্রেকগুলি (characters n অক্ষর) সরিয়ে দেয়
রিডকুলি

7
@ রিডকুলি: এর জন্য আপনি Jsoup#clean()পরিবর্তে ব্যবহার করতে চান ।
বালুসসি

3
পরিষ্কার () ব্যবহারের ফলে অতিরিক্ত স্থান এবং cha n অক্ষর সরানো হবে। উদাহরণস্বরূপ: Jsoup.clean ("a b n b", হোয়াইটলিস্ট.নোন ()) "a বি" ফেরায়
কিথ

20
@ জিরো: এটি খারাপভাবে ব্যর্থ <p>Lorem ipsum 1 < 3 dolor sit amet</p>। আবার, এইচটিএমএল কোনও নিয়মিত ভাষা নয় । এটি সত্যই পার্সার ব্যবহারের পরিবর্তে আগ্রহী অংশগুলি বিশ্লেষণ করার জন্য কেন সকলেই তার উপর রেজেেক্স ছুঁড়ে ফেলার চেষ্টা চালিয়ে যায় তা সম্পূর্ণভাবে আমার বাইরে।
বালুসসি

4
Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));লাইনব্রেকগুলি সংরক্ষণ করার জন্য ব্যবহার করুন
মার্ক জনন

275

আপনি যদি অ্যান্ড্রয়েডের জন্য লিখছেন তবে আপনি এটি করতে পারেন ...

android.text.Html.fromHtml(instruction).toString()

12
দুর্দান্ত টিপ :) আপনি যদি কোনও পাঠ্য ভিউতে পাঠ্য প্রদর্শন করে থাকেন তবে কিছু ফরম্যাটিং সংরক্ষণের জন্য আপনি .toString ()ও ড্রপ করতে পারেন।
লার্ন লালিবার্তে

1
@ ব্র্যাঙ্কি এটি চেষ্টা করে দেখিনি ... স্বীকৃত উত্তরটি কবিতার মতো কাজ করে
ম্যাভেরিক '

দুর্দান্ত কাজ করে। স্ট্রিং থেকে সমস্ত এইচটিএমএল ট্যাগ সরানো হয়েছে।
ব্যবহারকারী3144836

1
এটি ভাল তবে <img> ট্যাগগুলি কিছু উদ্ভট জিনিসগুলির সাথে প্রতিস্থাপন করা হয়েছে। আমি ছোট ছোট স্কোয়ার পেয়েছি যেখানে একটি চিত্র ছিল
বিবাসওয়ান বন্দ্যোপাধ্যায়

1
@ বিবাসওয়ানবান্দ্যপাধ্যায় আরেকটি উত্তর এই চরিত্রগুলি থেকে মুক্তি পেতে সহায়তা করে
ভিন্স

84

যদি ব্যবহারকারী প্রবেশ করে <b>hey!</b>, আপনি প্রদর্শন করতে চান <b>hey!</b>বা hey!? যদি প্রথমটি হয়, কম-থানা ছাড়ুন, এবং এইচটিএমএল-এনকোড অ্যাম্পারস্যান্ডগুলি (এবং optionচ্ছিকভাবে উদ্ধৃতি) এবং আপনি ভাল আছেন। দ্বিতীয় বিকল্পটি বাস্তবায়নের জন্য আপনার কোডে একটি পরিবর্তনটি হবে:

replaceAll("\\<[^>]*>","")

তবে ব্যবহারকারী সমস্যাগুলির মধ্যে দৌড়াদৌড়ি করবেন যদি ব্যবহারকারী কোনও ত্রুটিযুক্ত enোকান, যেমন <bhey!</b>

আপনি জেটিডিও পরীক্ষা করে দেখতে পারেন যা "নোংরা" এইচটিএমএল ইনপুটকে বিশ্লেষণ করবে এবং পাঠ্যটি রেখে ট্যাগগুলি মুছে ফেলার একটি উপায় আপনাকে দেওয়া উচিত should

এইচটিএমএল স্ট্রিপ করার চেষ্টা করার সাথে সমস্যাটি হ'ল ব্রাউজারগুলির খুব লেনিয়েন্ট পার্সার থাকে, আপনি যে লাইব্রেরি পাবেন তার চেয়ে আরও লেন্সিয়েন্ট, তাই আপনি যদি সমস্ত ট্যাগ সরিয়ে দেওয়ার জন্য যথাসাধ্য চেষ্টা করেন তবে (উপরের প্রতিস্থাপনের পদ্ধতিটি, একটি ডিওএম লাইব্রেরি বা জেটিডি ব্যবহার করে) , আপনার আউটপুট সুরক্ষিত রাখতে আপনার এখনও কোনও অবশিষ্ট এইচটিএমএল বিশেষ অক্ষর এনকোড করা নিশ্চিত করতে হবে।


1
আপনি যদি এইচটিএমএল নোড সামগ্রীর ভিতরে অপরিবর্তিত <বা> সাইন থাকে তবে আপনি ইস্যুতেও দৌড়াতে পারেন। <span> আমার বয়স << প্রচুর পাঠ্য> তারপরে আপনার বয়স </ span>। আমি মনে করি যে এটি করার জন্য কেবলমাত্র 100% উপায়টি কোনও এক্সএমএল ডোম ইন্টারফেসের মাধ্যমে (যেমন SAX বা অনুরূপ) নোড.জেটেক্সট () ব্যবহার করতে হবে।
মিতজা গুস্টিন

29

অন্য উপায়টি হ'ল javax.swing.text.html.HTMLEditorKit পাঠটি নিষ্কাশন করতে।

import java.io.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class Html2Text extends HTMLEditorKit.ParserCallback {
    StringBuffer s;

    public Html2Text() {
    }

    public void parse(Reader in) throws IOException {
        s = new StringBuffer();
        ParserDelegator delegator = new ParserDelegator();
        // the third parameter is TRUE to ignore charset directive
        delegator.parse(in, this, Boolean.TRUE);
    }

    public void handleText(char[] text, int pos) {
        s.append(text);
    }

    public String getText() {
        return s.toString();
    }

    public static void main(String[] args) {
        try {
            // the HTML to convert
            FileReader in = new FileReader("java-new.html");
            Html2Text parser = new Html2Text();
            parser.parse(in);
            in.close();
            System.out.println(parser.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

রেফ: কেবলমাত্র টেক্সট নিষ্কাশন করতে কোনও ফাইল থেকে এইচটিএমএল ট্যাগগুলি সরান


5
"ক <b> বি> সি" এর ফলাফল "আব বা বি> সি", যা দুর্ভাগ্যজনক বলে মনে হচ্ছে।
dfrankow

1
এটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। আমার লাইন ব্রেকগুলি সংরক্ষণ করা দরকার আমি পার্সারে এই সহজ পদ্ধতিটি যুক্ত করে করেছি: @ ওভাররাইড পাবলিক শূন্য হ্যান্ডেল স্টার্টট্যাগ (এইচটিএমএল.ট্যাগ টি, মিউটেবলঅ্যাট্রিবিউটসেট, ইন পোস্ট) {যদি (টি == এইচটিএমএল.ট্যাগ.পি || টি == এইচটিএমএল.ট্যাগ.বিআর) ; s.append ('\ n'); }}
মিগুয়েলমুনোজ

1
dfrankow: গাণিতিক অভিব্যক্তি <b> বা> সি এইচটিএমএলে লিখতে হবে: একটি & এলটি; খ বা বি & জিটি; সি
মিগুয়েলমুনোজ

24

আমি মনে করি যে এইচটিএমএল ট্যাগগুলি ফিল্টার করার সবচেয়ে সহজ উপায় হ'ল:

private static final Pattern REMOVE_TAGS = Pattern.compile("<.+?>");

public static String removeTags(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }

    Matcher m = REMOVE_TAGS.matcher(string);
    return m.replaceAll("");
}

18

জেরিকো ব্যবহার করে খুব সহজ এবং আপনি কিছু ফর্ম্যাটিং ধরে রাখতে পারেন (উদাহরণস্বরূপ লাইন ব্রেক এবং লিঙ্কগুলি)।

    Source htmlSource = new Source(htmlText);
    Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length());
    Renderer htmlRend = new Renderer(htmlSeg);
    System.out.println(htmlRend.toString());

4
জেরিকো একটি লাইন বিরতিতে <br> পার্স করতে সক্ষম হয়েছিল। Jsoup এবং HTMLEditorKit এটি করতে পারেনি।
হোমস্টো

জেরিকো এই কাজটি করতে খুব সক্ষম, এটি মালিকানাধীন প্রকল্পগুলিতে প্রচুর ব্যবহার করেছেন used
জেরি টিয়ান

3
জেরিকো কবজির মতো কাজ করেছিল। পরামর্শের জন্য ধন্যবাদ. একটি নোট: আপনাকে পুরো স্ট্রিংয়ের সেগমেন্ট তৈরি করতে হবে না। উত্সটি বিভাগকে প্রসারিত করে, সুতরাং হয় রেন্ডারার কনস্ট্রাক্টরে কাজ করে।
মিঃপ্রো

জেরিকো এখন কিছুটা তারিখযুক্ত বলে মনে হচ্ছে (শেষ প্রকাশটি 2015 সালের শেষ দিকে 3.4 ছিল)। তবে এটি যদি এখনও ভালভাবে কাজ করে তবে এটি এখনও ভালভাবে কাজ করে!
জোনাথন হুল্ট

17

করার স্বীকৃত উত্তরে কেবল Jsoup.parse(html).text()দুটি সম্ভাব্য সমস্যা রয়েছে (জেএসপ ১.7.৩ সহ):

  • এটি পাঠ্য থেকে লাইন ব্রেকগুলি সরিয়ে দেয়
  • এটি পাঠ্যকে রূপান্তর &lt;script&gt;করে<script>

আপনি যদি এক্সএসএস থেকে রক্ষা করতে এটি ব্যবহার করেন তবে এটি কিছুটা বিরক্তিকর। JSoup এবং অ্যাপাচি স্ট্রিংএস্কেপ ইউটিলস উভয়ই ব্যবহার করে উন্নত সমাধানে আমার সেরা শটটি এখানে:

// breaks multi-level of escaping, preventing &amp;lt;script&amp;gt; to be rendered as <script>
String replace = input.replace("&amp;", "");
// decode any encoded html, preventing &lt;script&gt; to be rendered as <script>
String html = StringEscapeUtils.unescapeHtml(replace);
// remove all html tags, but maintain line breaks
String clean = Jsoup.clean(html, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
// decode html again to convert character entities back into text
return StringEscapeUtils.unescapeHtml(clean);

নোট করুন যে শেষ পদক্ষেপটি কারণ আমাকে আউটপুটটিকে সরল পাঠ্য হিসাবে ব্যবহার করতে হবে। আপনার যদি কেবল এইচটিএমএল আউটপুট প্রয়োজন হয় তবে আপনার এটি সরাতে সক্ষম হওয়া উচিত।

এবং এখানে পরীক্ষাগুলির একগুচ্ছ (আউটপুট থেকে ইনপুট):

{"regular string", "regular string"},
{"<a href=\"link\">A link</a>", "A link"},
{"<script src=\"http://evil.url.com\"/>", ""},
{"&lt;script&gt;", ""},
{"&amp;lt;script&amp;gt;", "lt;scriptgt;"}, // best effort
{"\" ' > < \n \\ é å à ü and & preserved", "\" ' > < \n \\ é å à ü and & preserved"}

যদি আপনি এটি আরও ভাল করার কোনও উপায় খুঁজে পান তবে দয়া করে আমাকে জানান।


2
এটি যেমন কিছু বিরুদ্ধে ব্যর্থ হবে &#38;lt;script&#38;gt;alert('Evil script executed');&#38;lt;/script&#38;gt;। একই জন্য যায় &#x26;। JSoup রূপান্তর করে না &lt;script&gt; into <script>, এটি এটি করে কারণ আপনি StringEscapeUtils.unescapeHtmlJSoup ইনপুট পরিষ্কার করার পরে কল করেছিলেন।
গিলাইম পোলেট

15

অ্যান্ড্রয়েডে, এটি ব্যবহার করে দেখুন:

String result = Html.fromHtml(html).toString();

এটা এটা করেছে! এটি পাঠ্য থেকে সমস্ত ইনলাইন এইচটিএমএল সরিয়ে দিয়েছে :)
ড্রিটানএক্স

1
আপনি সর্বদা সাধারণ কোডের জন্য কোড স্নিপেট ব্যবহার করছেন। কোড স্নিপেটগুলি কেবল এইচটিএমএল বা জাভাস্ক্রিপ্ট বা অন্যান্য কোডের জন্য ব্যবহার করা হবে যা ব্রাউজারে চালানো যেতে পারে। আপনি ব্রাউজারে জাভা চালাতে পারবেন না। ভবিষ্যতে সাধারণ কোড ব্লক ব্যবহার করুন ... আমি আপনার উত্তরটি এবার সম্পাদনা করব এবং ফর্ম্যাটিং ইত্যাদি ঠিক করব, তবে দয়া করে ভবিষ্যতে আর এটি করবেন না। এই প্রথম আমি আপনাকে এই সম্পর্কে বলেছি না ...
জাভার ক্যাপেলার

1
@ পলক্রোকারিন এটি অ্যান্ড্রয়েড এসডির ভিতরে পাঠাগার। android.text.Html
আমিন মাহিন

1
অসাধারণ. সমস্ত এইচটিএমএল ট্যাগ সরানো হয়েছে।
ব্যবহারকারী3144836

2
পরিচিত মনে হচ্ছে, 2011 থেকে আমার উত্তর মত
কেন Goodridge

11

এইচটিএমএল এস্কেপিং সঠিকভাবে করা শক্ত - আমি অবশ্যই এটি করার জন্য লাইব্রেরি কোডটি ব্যবহার করার পরামর্শ দিচ্ছি, কারণ এটি আপনার ভাবার চেয়ে অনেক বেশি সূক্ষ্ম। এটিকে জাভাতে পরিচালনা করার জন্য সুন্দর একটি ভাল লাইব্রেরির জন্য অ্যাপাচি-এর স্ট্রিংএইস্কিপ ইউটিগুলি দেখুন


এটি আমি যে ধরণের জিনিসটি সন্ধান করছি তা হ'ল তবে আমি এইচটিএমএল এড়িয়ে চলার পরিবর্তে তা ছড়িয়ে দিতে চাই।
ম্যাসন

আপনি কি এইচটিএমএল স্ট্রিপ করতে চান, বা আপনি এটি সরল পাঠ্যে রূপান্তর করতে চান? বিআর ট্যাগ এবং এইচটিএমএল সত্তা সহ একটি দীর্ঘ স্ট্রিং থেকে এইচটিএমএল কেড়ে ফেলার ফলে একটি অযৌক্তিক জগাখিচুড়ি হতে পারে।
টিম হাওল্যান্ড 17

4
স্ট্রিংস্ক্রপ ইউটিલ્સ.উনস্কেপ এইচটিএমএল এইচটিএমএল স্ট্রিপ করে না
এরিন

5
আনস্কেপিংয়ের জন্য ব্যবহারের জন্য ব্যবহারগুলির সম্পর্কে ভাল তথ্য কিন্তু প্রশ্নের উত্তর দেওয়া হচ্ছে না।
অ্যালেক্স

3
বিভ্রান্তিকর উত্তর। অপসারণ করা হচ্ছে! = আনস্কেপিং
লুলুই মার্টিনেজ

7

এই কাজ করা উচিত -

এটা ব্যবহার কর

  text.replaceAll('<.*?>' , " ") -> This will replace all the html tags with a space.

এবং এই

  text.replaceAll('&.*?;' , "")-> this will replace all the tags which starts with "&" and ends with ";" like &nbsp;, &amp;, &gt; etc.

1
সাধারণত, উত্তরগুলি আরও কার্যকর হয় যদি তারা কোডটি কী করতে চায় তার ব্যাখ্যা অন্তর্ভুক্ত করে।
পিটার

6

টিএমের পরামর্শ অনুসারে আপনি এইচটিএমএলটিকে একটি অবৈধ জগাখিচু হয়ে যাওয়া রোধ করার আগে নতুন লাইনের সাথে প্রতিস্থাপন করতে <br/>এবং </p>ট্যাগ করতে পারেন ।

আমি এইচটিএমএল ট্যাগগুলি মুছে ফেলার কথা ভাবতে পারি তবে কোণ বন্ধনীগুলির মধ্যে নন- এইচটিএমএল রেখে যাওয়া HTML ট্যাগগুলির তালিকার বিরুদ্ধে পরীক্ষা করা । এই লাইন বরাবর কিছু ...

replaceAll("\\<[\s]*tag[^>]*>","")

যেমন তারপর এইচটিএমএল-ডিকোড বিশেষ অক্ষর &amp;। ফলাফলটি স্যানিটাইজড হিসাবে বিবেচনা করা উচিত নয়।


5

বিকল্পভাবে, কেউ এইচটিএমএল ক্লিনার ব্যবহার করতে পারেন :

private CharSequence removeHtmlFrom(String html) {
    return new HtmlCleaner().clean(html).getText();
}

2
এইচটিএমএল ক্লিনার ভাল কাজ করে, লাইন বিরতি রাখে এবং সাম্প্রতিক প্রকাশিত হয়েছে (মে 2017 এ 2.21)।
জোনাথন হুল্ট

4

গৃহীত উত্তরটি পরীক্ষার কেসটির জন্য আমার পক্ষে কাজ করে নি আমি নির্দেশিত করেছি: "ক <b> বি> সি" এর ফলাফল "আব বা বি> সি"।

সুতরাং, আমি পরিবর্তে ট্যাগসুপ ব্যবহার করেছি। এখানে একটি শট যা আমার পরীক্ষার কেসের জন্য কাজ করেছে (এবং আরও কয়েকজন):

import java.io.IOException;
import java.io.StringReader;
import java.util.logging.Logger;

import org.ccil.cowan.tagsoup.Parser;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

/**
 * Take HTML and give back the text part while dropping the HTML tags.
 *
 * There is some risk that using TagSoup means we'll permute non-HTML text.
 * However, it seems to work the best so far in test cases.
 *
 * @author dan
 * @see <a href="http://home.ccil.org/~cowan/XML/tagsoup/">TagSoup</a> 
 */
public class Html2Text2 implements ContentHandler {
private StringBuffer sb;

public Html2Text2() {
}

public void parse(String str) throws IOException, SAXException {
    XMLReader reader = new Parser();
    reader.setContentHandler(this);
    sb = new StringBuffer();
    reader.parse(new InputSource(new StringReader(str)));
}

public String getText() {
    return sb.toString();
}

@Override
public void characters(char[] ch, int start, int length)
    throws SAXException {
    for (int idx = 0; idx < length; idx++) {
    sb.append(ch[idx+start]);
    }
}

@Override
public void ignorableWhitespace(char[] ch, int start, int length)
    throws SAXException {
    sb.append(ch);
}

// The methods below do not contribute to the text
@Override
public void endDocument() throws SAXException {
}

@Override
public void endElement(String uri, String localName, String qName)
    throws SAXException {
}

@Override
public void endPrefixMapping(String prefix) throws SAXException {
}


@Override
public void processingInstruction(String target, String data)
    throws SAXException {
}

@Override
public void setDocumentLocator(Locator locator) {
}

@Override
public void skippedEntity(String name) throws SAXException {
}

@Override
public void startDocument() throws SAXException {
}

@Override
public void startElement(String uri, String localName, String qName,
    Attributes atts) throws SAXException {
}

@Override
public void startPrefixMapping(String prefix, String uri)
    throws SAXException {
}
}

4

আমি জানি এটি পুরানো, তবে আমি কেবলমাত্র এমন একটি প্রকল্পে কাজ করছি যা আমাকে এইচটিএমএল ফিল্টার করার প্রয়োজন ছিল এবং এটি দুর্দান্ত কাজ করেছে:

noHTMLString.replaceAll("\\&.*?\\;", "");

এর পরিবর্তে:

html = html.replaceAll("&nbsp;","");
html = html.replaceAll("&amp;"."");

4

বিরতি এবং তালিকাগুলির জন্য কিছু ফর্ম্যাটিং হ্যান্ডেল করার চেষ্টা করার জন্য এখানে আরও হালকা আরও হালকা আপডেট। আমি গাইড হিসাবে আমায়ার আউটপুট ব্যবহার করেছি।

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.Stack;
import java.util.logging.Logger;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;

public class HTML2Text extends HTMLEditorKit.ParserCallback {
    private static final Logger log = Logger
            .getLogger(Logger.GLOBAL_LOGGER_NAME);

    private StringBuffer stringBuffer;

    private Stack<IndexType> indentStack;

    public static class IndexType {
        public String type;
        public int counter; // used for ordered lists

        public IndexType(String type) {
            this.type = type;
            counter = 0;
        }
    }

    public HTML2Text() {
        stringBuffer = new StringBuffer();
        indentStack = new Stack<IndexType>();
    }

    public static String convert(String html) {
        HTML2Text parser = new HTML2Text();
        Reader in = new StringReader(html);
        try {
            // the HTML to convert
            parser.parse(in);
        } catch (Exception e) {
            log.severe(e.getMessage());
        } finally {
            try {
                in.close();
            } catch (IOException ioe) {
                // this should never happen
            }
        }
        return parser.getText();
    }

    public void parse(Reader in) throws IOException {
        ParserDelegator delegator = new ParserDelegator();
        // the third parameter is TRUE to ignore charset directive
        delegator.parse(in, this, Boolean.TRUE);
    }

    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        log.info("StartTag:" + t.toString());
        if (t.toString().equals("p")) {
            if (stringBuffer.length() > 0
                    && !stringBuffer.substring(stringBuffer.length() - 1)
                            .equals("\n")) {
                newLine();
            }
            newLine();
        } else if (t.toString().equals("ol")) {
            indentStack.push(new IndexType("ol"));
            newLine();
        } else if (t.toString().equals("ul")) {
            indentStack.push(new IndexType("ul"));
            newLine();
        } else if (t.toString().equals("li")) {
            IndexType parent = indentStack.peek();
            if (parent.type.equals("ol")) {
                String numberString = "" + (++parent.counter) + ".";
                stringBuffer.append(numberString);
                for (int i = 0; i < (4 - numberString.length()); i++) {
                    stringBuffer.append(" ");
                }
            } else {
                stringBuffer.append("*   ");
            }
            indentStack.push(new IndexType("li"));
        } else if (t.toString().equals("dl")) {
            newLine();
        } else if (t.toString().equals("dt")) {
            newLine();
        } else if (t.toString().equals("dd")) {
            indentStack.push(new IndexType("dd"));
            newLine();
        }
    }

    private void newLine() {
        stringBuffer.append("\n");
        for (int i = 0; i < indentStack.size(); i++) {
            stringBuffer.append("    ");
        }
    }

    public void handleEndTag(HTML.Tag t, int pos) {
        log.info("EndTag:" + t.toString());
        if (t.toString().equals("p")) {
            newLine();
        } else if (t.toString().equals("ol")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("ul")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("li")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("dd")) {
            indentStack.pop();
            ;
        }
    }

    public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        log.info("SimpleTag:" + t.toString());
        if (t.toString().equals("br")) {
            newLine();
        }
    }

    public void handleText(char[] text, int pos) {
        log.info("Text:" + new String(text));
        stringBuffer.append(text);
    }

    public String getText() {
        return stringBuffer.toString();
    }

    public static void main(String args[]) {
        String html = "<html><body><p>paragraph at start</p>hello<br />What is happening?<p>this is a<br />mutiline paragraph</p><ol>  <li>This</li>  <li>is</li>  <li>an</li>  <li>ordered</li>  <li>list    <p>with</p>    <ul>      <li>another</li>      <li>list        <dl>          <dt>This</dt>          <dt>is</dt>            <dd>sdasd</dd>            <dd>sdasda</dd>            <dd>asda              <p>aasdas</p>            </dd>            <dd>sdada</dd>          <dt>fsdfsdfsd</dt>        </dl>        <dl>          <dt>vbcvcvbcvb</dt>          <dt>cvbcvbc</dt>            <dd>vbcbcvbcvb</dd>          <dt>cvbcv</dt>          <dt></dt>        </dl>        <dl>          <dt></dt>        </dl></li>      <li>cool</li>    </ul>    <p>stuff</p>  </li>  <li>cool</li></ol><p></p></body></html>";
        System.out.println(convert(html));
    }
}

4

ব্যবহার Html.fromHtml

এইচটিএমএল ট্যাগ হয়

<a href=”…”> <b>,  <big>, <blockquote>, <br>, <cite>, <dfn>
<div align=”…”>,  <em>, <font size=”…” color=”…” face=”…”>
<h1>,  <h2>, <h3>, <h4>,  <h5>, <h6>
<i>, <p>, <small>
<strike>,  <strong>, <sub>, <sup>, <tt>, <u>

অনুযায়ী অ্যান্ড্রয়েড এর অফিসিয়াল নথি যে কোন ট্যাগ এইচটিএমএল একটি জেনেরিক পরিবর্তে প্রদর্শন করা হবে স্ট্রিং যা আপনার প্রোগ্রাম তারপর মধ্য দিয়ে যেতে এবং বাস্তব সঙ্গে প্রতিস্থাপন করতে পারেন স্ট্রিং

Html.formHtmlপদ্ধতিটি একটি Html.TagHandlerএবং একটি এইচটিএমএল লাগে।আম্বেজেটরটি আর্গুমেন্টের পাশাপাশি পাঠ্যকে বিশ্লেষণের জন্য নেয়।

উদাহরণ

String Str_Html=" <p>This is about me text that the user can put into their profile</p> ";

তারপর

Your_TextView_Obj.setText(Html.fromHtml(Str_Html).toString());

আউটপুট

এটি আমার পাঠ্য সম্পর্কে যা ব্যবহারকারী তাদের প্রোফাইলে রাখতে পারেন


1
কোনও অতিরিক্ত ইউটিলিটি এবং অ্যান্ড্রয়েড ডক্সের সাথে সারিবদ্ধ হয় না। +1
ডেভিডবেটস

4

কীভাবে সমস্ত প্রতিস্থাপন করা যায় তার আরও একটি বৈকল্পিক এখানে রয়েছে (এইচটিএমএল ট্যাগস | এইচটিএমএল সত্তা | এইচটিএমএল সামগ্রীতে খালি স্থান)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); যেখানে সামগ্রী একটি স্ট্রিং।


1
আমি এটিকে কিছুটা উন্নত করেছি: {কোড} .প্লেসএল ("(<। *?>)) ((&। * ?;)", "") .পরিবর্তন সমস্ত ("\\ s {2,}", "") { কোড} কারণ প্রায়শই এই ট্যাগগুলি পাঠ্যের ঠিক পাশেই থাকে। এবং ট্যাগগুলি অপসারণের পরে সমস্ত 2 এবং আরও বেশি লেখার জায়গাগুলি মাত্র 1 এ পরিবর্তন করুন
ওন্ডেজ স্টাটেক

4

আপনি কেবল অ্যান্ড্রয়েডের ডিফল্ট এইচটিএমএল ফিল্টার ব্যবহার করতে পারেন

    public String htmlToStringFilter(String textToFilter){

    return Html.fromHtml(textToFilter).toString();

    }

উপরের পদ্ধতিটি আপনার ইনপুটটির জন্য HTML ফিল্টারযুক্ত স্ট্রিংটি ফিরিয়ে দেবে।


3

আর একটি উপায় হ'ল com.google.gdata.util.common.html.HtmlToText শ্রেণীর মতো ব্যবহার করা যেতে পারে

MyWriter.toConsole(HtmlToText.htmlToPlainText(htmlResponse));

এটি যদিও বুলেট প্রুফ কোড নয় এবং আমি যখন উইকিপিডিয়া এন্ট্রিগুলিতে এটি চালাচ্ছি তখন আমি স্টাইলের তথ্যও পাচ্ছি। তবে আমি বিশ্বাস করি ছোট / সাধারণ কাজের জন্য এটি কার্যকর হবে।


3

মনে হচ্ছে আপনি এইচটিএমএল থেকে সরল পাঠ্যে যেতে চান।
যদি তা হয় তবে www.htmlparser.org এ দেখুন। এখানে একটি উদাহরণ যা URL এ পাওয়া HTML টি ফাইল থেকে সমস্ত ট্যাগ সরিয়ে দেয়।
এটি org.htmlparser.beans.StringBean ব্যবহার করে ।

static public String getUrlContentsAsText(String url) {
    String content = "";
    StringBean stringBean = new StringBean();
    stringBean.setURL(url);
    content = stringBean.getStrings();
    return content;
}

2

এটি করার আরেকটি উপায় এখানে:

public static String removeHTML(String input) {
    int i = 0;
    String[] str = input.split("");

    String s = "";
    boolean inTag = false;

    for (i = input.indexOf("<"); i < input.indexOf(">"); i++) {
        inTag = true;
    }
    if (!inTag) {
        for (i = 0; i < str.length; i++) {
            s = s + str[i];
        }
    }
    return s;
}

অথবা আপনি কেবল বলতে পারেন, (ইনপুট.ইন্ডেক্সঅফ ("<")> 0 || ইনপুট.ইন্ডেক্সঅফ (">")> 0) "" ফিরে আসে; অন্যথায় ইনপুট ফেরত;
হোসেইন শাহদুস্ট

2

এই উদ্দেশ্যে কেউ অ্যাপাচি টিকা ব্যবহার করতে পারে । ডিফল্টরূপে এটি স্ট্রিপড এইচটিএমএল থেকে শ্বেতস্থান সংরক্ষণ করে, যা কিছু পরিস্থিতিতে পছন্দসই হতে পারে:

InputStream htmlInputStream = ..
HtmlParser htmlParser = new HtmlParser();
HtmlContentHandler htmlContentHandler = new HtmlContentHandler();
htmlParser.parse(htmlInputStream, htmlContentHandler, new Metadata())
System.out.println(htmlContentHandler.getBodyText().trim())

1
নোট করুন যে পার্স পদ্ধতিটি পক্ষে হ্রাস করা হয়েছে Parse.parse(InputStream, ContentHandler, Metadata, ParseContext)
জ্যাকব ভ্যান লিনজেন

1

JSoup এর সাথে নতুন লাইন তথ্য ধরে রাখার একটি উপায় হ'ল কিছু ডামি স্ট্রিং সহ সমস্ত নতুন লাইন ট্যাগের আগে, JSoup চালানো এবং "\ n" দিয়ে ডামি স্ট্রিং প্রতিস্থাপন।

String html = "<p>Line one</p><p>Line two</p>Line three<br/>etc.";
String NEW_LINE_MARK = "NEWLINESTART1234567890NEWLINEEND";
for (String tag: new String[]{"</p>","<br/>","</h1>","</h2>","</h3>","</h4>","</h5>","</h6>","</li>"}) {
    html = html.replace(tag, NEW_LINE_MARK+tag);
}

String text = Jsoup.parse(html).text();

text = text.replace(NEW_LINE_MARK + " ", "\n\n");
text = text.replace(NEW_LINE_MARK, "\n\n");

1
classeString.replaceAll("\\<(/?[^\\>]+)\\>", "\\ ").replaceAll("\\s+", " ").trim() 

3
যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। আপনার কোডটি ব্যাখ্যামূলক মন্তব্যে ভিড় না করার চেষ্টা করুন, এটি কোড এবং ব্যাখ্যা উভয়ের পাঠযোগ্যতা হ্রাস করে!
ফিলনার

0

আমার 5 সেন্ট:

String[] temp = yourString.split("&amp;");
String tmp = "";
if (temp.length > 1) {

    for (int i = 0; i < temp.length; i++) {
        tmp += temp[i] + "&";
    }
    yourString = tmp.substring(0, tmp.length() - 1);
}

0

সরল এইচটিএমএল পাঠ্য গঠনের জন্য আপনি এটি করতে পারেন:

String BR_ESCAPED = "&lt;br/&gt;";
Element el=Jsoup.parse(html).select("body");
el.select("br").append(BR_ESCAPED);
el.select("p").append(BR_ESCAPED+BR_ESCAPED);
el.select("h1").append(BR_ESCAPED+BR_ESCAPED);
el.select("h2").append(BR_ESCAPED+BR_ESCAPED);
el.select("h3").append(BR_ESCAPED+BR_ESCAPED);
el.select("h4").append(BR_ESCAPED+BR_ESCAPED);
el.select("h5").append(BR_ESCAPED+BR_ESCAPED);
String nodeValue=el.text();
nodeValue=nodeValue.replaceAll(BR_ESCAPED, "<br/>");
nodeValue=nodeValue.replaceAll("(\\s*<br[^>]*>){3,}", "<br/><br/>");

করতে প্লেইন টেক্সট formateed \ N দ্বারা পরিবর্তন <br/> দ্বারা শেষ লাইনটি পরিবর্তন করুন:

nodeValue=nodeValue.replaceAll("(\\s*\n){3,}", "<br/><br/>");

0

আমি জানি যে এই প্রশ্নটি জিজ্ঞাসা করা হওয়ার পরে অনেক সময় হয়েছে, তবে আমি আরও একটি সমাধান পেয়েছি, এটিই আমার পক্ষে কাজ করেছে:

Pattern REMOVE_TAGS = Pattern.compile("<.+?>");
    Source source= new Source(htmlAsString);
 Matcher m = REMOVE_TAGS.matcher(sourceStep.getTextExtractor().toString());
                        String clearedHtml= m.replaceAll("");

-1

আপনি কেবল একাধিক রিপ্লেসমএল () এর মতো একটি পদ্ধতি তৈরি করতে পারেন

String RemoveTag(String html){
   html = html.replaceAll("\\<.*?>","")
   html = html.replaceAll("&nbsp;","");
   html = html.replaceAll("&amp;"."");
   ----------
   ----------
   return html;
}

আপনার প্রয়োজনীয় সর্বাধিক সাধারণ প্রতিস্থাপনের জন্য এই লিঙ্কটি ব্যবহার করুন: http://unees.org/wiki/html_20 স্পেশাল_20characters_20 এবং_20 symbols.html

এটি সহজ তবে কার্যকর। আমি জাঙ্কটি অপসারণ করতে প্রথমে এই পদ্ধতিটি ব্যবহার করি তবে একেবারে প্রথম লাইন নয় যেমন প্রতিস্থাপনআল ("\ <। *?>", ""), এবং পরে আমি সূচীগুলি অনুসন্ধান করার জন্য নির্দিষ্ট কীওয়ার্ড ব্যবহার করি এবং তারপরে সাবস্ক্রিং (শুরু, শেষ) ব্যবহার করি ) অপ্রয়োজনীয় জিনিস ছিনিয়ে নেওয়ার পদ্ধতি। যেহেতু এটি আরও দৃust় এবং আপনি সম্পূর্ণ HTML পৃষ্ঠায় যা প্রয়োজন ঠিক তা পিন করতে পারেন।


4
দুটি নোট। প্রথমত, এটি সাবঅপটিমাল - প্রতিটি প্রতিস্থাপনকলের জন্য, জাভা প্রথম যুক্তিটি রেজেক্স হিসাবে সংকলন করার চেষ্টা করবে এবং স্ট্রিংটিতে সেই রেজেক্সটি প্রয়োগ করার জন্য পুরো স্ট্রিংয়ের মধ্য দিয়ে চলবে, প্রতিবার নিয়মিত এইচএমএল পৃষ্ঠায় কয়েক ডজন কেবি প্রক্রিয়াকরণ করবে। দ্বিতীয়ত, এটি সরল (নন-রেজেক্স) স্ট্রিংগুলি প্রতিস্থাপনের জন্য প্রতিস্থাপনআল ব্যবহার না করার পরিবর্তে প্রতিস্থাপন () যা নামের পরিবর্তে সমস্তটি প্রতিস্থাপন করে) ব্যবহার করুন advised
fwelstra

-1

স্ট্রিং থেকে এইচটিএমএল ট্যাগগুলি সরান। কোথাও আমাদের কিছু স্ট্রিংকে পার্স করা দরকার যা সার্ভার থেকে এইচটিপিগ্রাসনসের মতো কিছু প্রতিক্রিয়া পেয়েছে।

সুতরাং আমাদের এটি বিশ্লেষণ করা প্রয়োজন।

এখানে আমি দেখাব কিভাবে স্ট্রিং থেকে এইচটিএমএল ট্যাগগুলি সরানো যায়।

    // sample text with tags

    string str = "<html><head>sdfkashf sdf</head><body>sdfasdf</body></html>";



    // regex which match tags

    System.Text.RegularExpressions.Regex rx = new System.Text.RegularExpressions.Regex("<[^>]*>");



    // replace all matches with empty strin

    str = rx.Replace(str, "");



    //now str contains string without html tags

আপনি কোথা new System.Text.RegularExpressions.Regex();থেকে পাবেন?
বেরেসফোর্ড

1
@beresfordt এই প্রতিক্রিয়া .NET- র ক্ষেত্রে প্রযোজ্য, জাভা-র মতো প্রশ্নে অনুরোধ করা হয়নি
এরিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.