正则表达式从HTML字符串替换样式的属性

时间:2017-01-13 20:51:17

标签: java html regex

我想要一个正则表达式,它从给定html标签的style属性中删除属性列表。

例如:我想从span标签中删除高度和光标。

I / P:

String htmlFragment ="<span id=\"nav-askquestion\" style=\"width:200px;cursor:default;height:100px;\" name="questions"> <b>hh</b></span>";

O / P

<span id="nav-askquestion" style="width:200px;" name="questions"><b>hh</b></span>

我有以下正则表达式,但它删除了所有出现的高度和光标,而不仅仅是div

String cleanString=htmlFragment.replaceAll("(height|cursor)[ ]*:[ ]*[^;]+;",""); 

由于具体要求,不打算使用html解析器。

3 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

\s*(height|cursor)\s*:\s*.+?\s*;\s*

您可以测试here

如果除了高度和光标之外还有其他属性,你想要捕捉,你可以继续在它们之间添加条形(背景颜色|高度|字体大小)等。

答案 1 :(得分:1)

我同意其他人的说法,最好使用HTML / XML解析器,它允许您深入查看特定元素,而不必担心任何“意外”正则表达式匹配。

但是,阅读了Xlsx的comment,“您不能只使用一个RegEx。”我被迫使用捕获的组发布此解决方案。这纯粹仅用于演示目的

String reg = "(<span.+)((height|cursor) *:[^;]+;)(.*)((height|cursor) *:[^;]+;)(.*)";

String cleanString=htmlFragment.replaceAll(reg, "$1$4$7"); 

显然,它不漂亮,它可能仍然匹配一些HTML内容(而不是标签),但它是可能的。除非这是一个快速解决方案,否则我建议您按照其他人的建议使用更合适的解决方案。一种可能的解决方案是jsoup

答案 2 :(得分:0)

正如我之前所说,我强烈建议不要使用RegEx,并使用HTML / XML解析器解析标签和数据,然后进行所有操作。

但是如果你因某些原因不想那样做那么我会建议你回退到基本的基于子字符串的方法,而不是使用RegEx

以下是针对上述情况的示例代码段:

public static void main(String[] args) {
    String htmlFragment = "<span id=\"nav-askquestion\" style=\"width:200px;cursor:default;height:100px;\" name=\"questions\"> <b>hh</b></span>";
    int startIndex = htmlFragment.indexOf("<span");
    int stopIndex = htmlFragment.indexOf("</span>") + 7;

    /* Cursor */
    int cursorStart = htmlFragment.indexOf("cursor:", startIndex);
    int cursorEnd = htmlFragment.indexOf(";", cursorStart);
    htmlFragment = new StringBuilder()
            .append(htmlFragment.substring(startIndex, cursorStart))
            .append(htmlFragment.substring(cursorEnd + 1, stopIndex))
            .toString();

    /* Update Indices */
    stopIndex = htmlFragment.indexOf("</span>") + 7;

    /* Height */
    int heightStart = htmlFragment.indexOf("height:", startIndex);
    int heightEnd = htmlFragment.indexOf(";", heightStart);
    htmlFragment = new StringBuilder()
            .append(htmlFragment.substring(startIndex, heightStart))
            .append(htmlFragment.substring(heightEnd + 1, stopIndex))
            .toString();

    /* Output */
    System.out.println(htmlFragment);
}

我知道它看起来有点乱,但这是我能想到的唯一方法。