【问题标题】:Regex to remove multiple html nested tags [duplicate]正则表达式删除多个 html 嵌套标签 [重复]
【发布时间】:2014-12-11 17:31:21
【问题描述】:

我的 html 刺痛如下:

<p dir="ltr">hello boys <b><b><b><b><b><b><b><b><b>n</b></b></b></b></b></b></b></b></b><b><b><b><b><b><b><b><b>o</b></b></b></b></b></b></b></b><b><b><b><b><b><b><b>w</b></b></b></b></b></b></b><b><b><b><b><b><b> </b></b></b></b></b></b><b><b><b><b><b>b</b></b></b></b></b><b><b><b><b>o</b></b></b></b><b><b><b>l</b></b></b><b><b>d</b></b><b> </b></p>

我想保留&lt;p dir="ltr"&gt;标签,一个包含所有单个粗体字符的&lt;b&gt;&lt;/b&gt;

结果应该是:

<p dir="ltr">hello boys <b>now bold</b></p>

&lt;b&gt;&lt;/b&gt;的数量不会固定

在 Java 中可以遵循什么正则表达式来做同样的事情。除了粗体,斜体和下划线也会出现

如果文本同时包含粗体、斜体和下划线这 3 种格式,则生成的 html 为:

<p dir="ltr"><b><b><b><b>bold</b></b></b></b> <i><i><i><i><i><i><i><i>italic</i></i></i></i></i></i></i></i><i> </i>normal <u><u><u><u><u><u><u><u>underline</u></u></u></u></u></u></u></u> <b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b>all</b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b> </b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><u><b>together</b></u></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></p>

应用 traianus 建议的正则表达式后,输出变为(我已应用粗体、斜体和下划线的格式):

<p dir="ltr"><b>bold</b> <i>italic</i> normal <u>underline all together</u></p>

因此,underline all together 应该将 b、i 和 u 标签放在一起以显示正确的格式。

代码:

String htmlString=Html.toHtml(mainEditText.getText());
        String boldRemoval = htmlString.replaceAll("<b>([a-z]*)</b>", "#$1#").replaceAll("(<b>|</b>)", "").replaceAll("#(.*)#", "<b>$1</b>").replaceAll("#", "");
        String italicRemoval = boldRemoval.replaceAll("<i>([a-z]*)</i>", "#$1#").replaceAll("(<i>|</i>)", "").replaceAll("#(.*)#", "<i>$1</i>").replaceAll("#", "");
        String underlineRemoval = italicRemoval.replaceAll("<u>([a-z]*)</u>", "#$1#").replaceAll("(<u>|</u>)", "").replaceAll("#(.*)#", "<u>$1</u>").replaceAll("#", "");
        Log.d("solution", underlineRemoval);

【问题讨论】:

  • 你不能。使用 html 解析器从父 b 标签和连续 b 标签中提取文本内容,然后连接和替换。
  • @CasimiretHippolyte 任何示例代码或教程都会有很大帮助
  • 这是正则表达式的错误用例。我认为 jsoup 可能是您正在寻找的。​​span>
  • @nerdwaller 怎么办?

标签: java html regex formatting


【解决方案1】:

如果您放宽您的问题以允许多轮替换(如 Casimir 所说),并假设输入中不允许使用 # 字符,这样的事情可能会有所帮助:

String test = "&lt;p dir=\"ltr\"&gt;hello boys &lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;n&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;o&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;w&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;b&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;o&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;l&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;d&lt;/b&gt;&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;";

String solution = test.replaceAll("&lt;b&gt;([a-z]*)&lt;/b&gt;", "#$1#").replaceAll("(&lt;b&gt;|&lt;/b&gt;)", "").replaceAll("#(.*)#", "&lt;b&gt;$1&lt;/b&gt;").replaceAll("#", ""));

【讨论】:

  • 你拯救了我的一天,一切正常。但是,如果 html 中的某些文本都具有粗体、斜体和下划线样式,则只剩下下划线标记,其余的都消失了。怎么处理?
  • 请发一个例子。
  • 请检查已编辑的问题
  • 如果您有许多不同的嵌套标签 (&lt;b&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;),使用正则表达式过滤掉它是一件非常痛苦的事情。在这种情况下,您应该像其他人所说的那样选择另一种方法。
  • 是的,那该怎么办?
【解决方案2】:
 String s = "<p dir=\"ltr\">hello boys <b><b><b><b><b><b><b><b><b>n</b></b></b></b></b></b></b></b></b><b><b><b><b><b><b><b><b>o</b></b></b></b></b></b></b></b><b><b><b><b><b><b><b>w</b></b></b></b></b></b></b><b><b><b><b><b><b> </b></b></b></b></b></b><b><b><b><b><b>b</b></b></b></b></b><b><b><b><b>o</b></b></b></b><b><b><b>l</b></b></b><b><b>d</b></b><b> </b></p>";
    while (!s.equals(s = s.replaceAll("<b><b>([^<>]+)</b></b>", "<b>$1</b>"))) {
    }
    System.out.println(s.replaceAll("</b><b>", ""));

【讨论】:

    【解决方案3】:
    s = s.replaceAll("(</?(?:b|i|u)>)\\1+", "$1").replaceAll("</(b|i|u)><\\1>", "");
    

    【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2012-12-16
    相关资源
    最近更新 更多