当前位置: 首页 > 知识库问答 >
问题:

使用jsoup将html文本替换为span

茹照
2023-03-14

我想改变HTML元素的文本内容,使其具有一定的背景色。HTML的格式如下

  <html>
   <head></head>
   <body>Gc <br>
   Stable <br>
   Oral intake better <br>
   Urine stool normal <br>
   </body>
</html>

我有像下面这样需要匹配的关键字:

Gc,Stable,Oral,Urine

我有字符串形式的html

"<html><head></head><body>Gc <br>Stable <br>Oral intake better <br>Urine stool normal <br>Pain Relief <br>Vital stable <br>No problem <br>Adv tab pan 40mg 1od <br>Tab pcm500mg 6hourly <br>Cab gab 300mg 1bd <br>Cab becasol 1od <br>Cab Tramadol 50mg 6hourly   </body></html>"

我想匹配元素文本内容,并在匹配HTML字符串时用关键字替换它们。我会改变他们的跨度有给定的背景颜色和匹配关键字的文本。

生成的HTML如下所示。

<html>
 <head></head>
 <body>
  <div>   
   <div>
     <span style="background: #FF9999;">Gc</span> 
    <br><span style="background: #FF9999;">Stable</span> 
    <br><span style="background: #FF9999;">Oral</span> intake better 
    <br><span style="background: #FF9999;">Urine</span> stool normal 
    <br>Pain Relief 
    <br>Vital stable 
    <br>No problem 
    <br>Adv tab pan 40mg 1od 
    <br>Tab pcm500mg 6hourly 
    <br>Cab gab 300mg 1bd 
    <br>Cab becasol 1od 
    <br>Cab Tramadol 50mg 6hourly 
   </div>  
  </div>
 </body>
</html>

如何用java实现它。我正在使用jsoup库。

这个代码对我有用。这是最佳方法吗?。或者有没有更好的替代html字符串的方法

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.TextNode;
import org.jsoup.parser.Tag;
import org.jsoup.select.Elements;

public class regexReplaceHtml {

    public static void main(String args[]) throws IOException {

        String html2 = "<html><head></head><body>Gc <br>Stable <br>Oral intake better <br>Urine stool normal <br>Pain Relief <br>Vital stable <br>No problem <br>Adv tab pan 40mg 1od <br>Tab pcm500mg 6hourly <br>Cab gab 300mg 1bd <br>Cab becasol 1od <br>Cab Tramadol 50mg 6hourly   </body></html>";


        String html = "<div>" + html2 + "</div>";

        Document doc = Jsoup.parse(html);

        List<String> keywords = new ArrayList<String>();
        keywords.add("Gc");
        keywords.add("Stable");
        keywords.add("Oral");
        keywords.add("Urine");

        String convertedString = replaceHtmlString(doc.html(),keywords);

        System.out.println(convertedString);

    }

   public static String replaceHtmlString(String html, List<String> keywords) {
        String htmlString = "<div>" + html + "</div>";

        Document doc = Jsoup.parse(htmlString);
        Elements elements = doc.body().children().select("*");

        for (Element element : elements) {

            List<TextNode> tnList = element.textNodes();

            for (TextNode tn : tnList) {
                String nodeTrimmedText = tn.text().trim();

                for (int i = 0; i < keywords.size(); i++) {
                    String keyword = keywords.get(i);
                    if (isContainExactWord(nodeTrimmedText, keyword)) {
                        String nodeText = tn.text();
                        String keywordHtmlString = "<span style=\"background: #FF9999;\">" + keyword + "</span>";
                        String replacedTextHtmlString = nodeText.replace(keyword, keywordHtmlString);
                        tn.text(replacedTextHtmlString);
                    }
                }

            }
        }

        //I had to replace the &lt; and &gt; with the respective symbols
        return doc.html().replaceAll("&lt;", "<").replaceAll("&gt;", ">");
    }

    private static boolean isContainExactWord(String fullString, String partWord) {
        String pattern = "\\b" + partWord + "\\b";
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(fullString);
        return m.find();
    }

}

共有2个答案

羊舌承颜
2023-03-14

有一个regexp解决方案:

        Matcher matcher = Pattern.compile("(Gc|Stable|Oral|Urine)").matcher(html);

        while (matcher.find()) {
            for (int i = 1; i <= matcher.groupCount(); i++) {
                html = html.replace(matcher.group(i), String.format("<span style=\"background-color:#FF9999;\">%s</span>", matcher.group(i)));
            }
        }
呼延曜灿
2023-03-14

下面的代码应该执行您想要的操作。它获取一个关键字列表,并用您提到的span标记替换它们。

List<String> keywords = new ArrayList<String>();
keywords.add("Gc");
keywords.add("Stable");
keywords.add("Oral");
keywords.add("Urine");

Element body = doc.getElementsByTag("body").first();

List<TextNode> nodes = body.textNodes();

for(TextNode node : nodes){
    String nodeText = node.text();

    for(String keyword : keywords){
        if(nodeText.contains(keyword)){
            String newText = nodeText.replace(keyword, "");
            node.text(newText);

            node.before("<span style=\"background-color:#FF9999;\">" + keyword + "</span>");
        }
    }
}
 类似资料:
  • 这是我的密码 我想替换字体标签,并把span标签。在这将取代第一个字体标签但不是第二个标签

  • 您好,我已经尝试了以下答案:如何使用jsoup替换标记,以及如何使用jsoup替换HTML标记,但都没有成功。我正在用JSoup解析一个网站,我运行了一个accross-letter-look GIF图像。幸运的是,这些gif图像有一个特定的名称,例如字母“a”的a.gif。 HTML输入: 期望输出: 我的java代码(以下)未打印预期输出: 谢谢你的帮助。

  • 问题内容: 我有以下代码: 结果是: 但我想打破界限: 我已经看过jsoup的TextNode#getWholeText(),但是我不知道如何使用它。 如果我解析的标记中有一个,如何在结果输出中换行? 问题答案: 保留换行符的真正解决方案应该是这样的: 满足以下要求: 如果原始html包含换行符(\ n),则保留它 如果原始html包含br或p标签,它们将被翻译为换行符(\ n)。

  • 我已经找到了几个有类似问题和有价值答案的主题,但我仍然在纠结这个: 我想用Jsoup解析一些html,这样我就可以替换,例如, 与 ,但仅当它出现在html的文本部分时,如果它是标签的一部分,则不会。所以,从这个html开始: 我想说的是: 我尝试了几种方法,这种方法使我更接近预期的结果: 但使用这种方法,我发现了两个问题: > 换行符在我引入的新元素之前和之后插入。这不是一个真正的问题,因为如果

  • 问题内容: 我正在做一个Maven项目,该项目使我可以解析网站中的html数据。我可以使用下面的代码来解析它: 到目前为止,我还没有问题。我可以解析html数据。我正在从jsoup中使用select方法,并使用“ div.col- section”检索数据,这意味着我正在使用class为col- section的div元素进行查找。我想在textarea中打印数据。即使网站上的实际数据超过一个段落