正则表达式剥离大于>并且小于< HTML字符串中的字符忽略现有标记

时间:2015-05-29 17:05:03

标签: java html regex

我没有很多正则表达式的经验,而且我需要将><的所有实例替换为&lt;&gt;,但是保留HTML标签。

例如:

String string =" <p class=\"anotherClass\"> Here is some text the value is for H<sub>2</sub>O is > 1 and < 100 <p>";
//need to be converted to:
<p class=\"anotherClass\"> Here is some text the value is for H<sub>2</sub>O is  &gt; 1 and  &lt; 100 <p>";

我已经尝试了一些前瞻性和前后的表达式,但我似乎无法让它们中的任何一个起作用。例如:

String string =" <p class=\"anotherClass\"> Here is some text the value is for H<sub>2</sub>) is > 1 and < 100 <p>";

String reg1="<(?=[^>\\/]*<\\/)";


Pattern p1 = Pattern.compile(reg1);

test = p1.matcher(string).replaceAll("&lt;");

似乎没有任何效果。

我想知道是否有其他人曾经遇到过此问题,或者是否有人可以给我任何指导?

2 个答案:

答案 0 :(得分:1)

单独使用正则表达式“解析”HTML标记带来了一些重要的警告,SA上的许多人都对此进行了评论。但是,您的请求相对适中。

标记之间的裸<符号可以在<(?=[^>]*(?:<|$))找到,并替换为&lt;

标记之间的裸>符号可以在((?:^|>)[^<]*?)>找到,并替换为\1&gt;

请注意,两者都必须在整个字符串上完成(而不是按行)。例如。 .必须与\n匹配,^必须与字符串的开头(不是行)匹配,$必须与字符串的结尾(不是行)匹配。

另请注意,每次都必须执行多次,直到没有结果,因为标签之间一次只能进行一次替换。

注意事项:

  • 这只能找到并替换流浪的<>符号这些标签之间,而不是标签本身。这意味着它会像{{1}那样陷入困境}}。
  • 如果可行的话,您应该检查由此产生的有效性更改,或至少通过自动检查程序运行。
  • 这些正则表达式耗费时间,因此如果速度成为问题则可能不实用。

要重申其他人提出的观点,请考虑使用标记解析器,如果使用不受信任的输入做任何工作。

答案 1 :(得分:0)

如果所有<> 出现在其转义版本(&lt;&gt;)中,您就可以匹配并且使用正则表达式删除它们。

但如果他们不是(这似乎是你的情况),最终,由于HTML / XML标签的嵌套特性,你只能使用正则表达式来达到100%的准确度。

您最好的选择是 HTML解析器,例如 jsoup

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupExtractGtLt {
    public static void main(String[] args) {
        String html = "<p class=\"anotherClass\"> Here is some text the value is for H<sub>2</sub>) is > 1 and < 100 <p>";
        Document doc = Jsoup.parseBodyFragment(html);
        String parsedHTML = doc.body().unwrap().toString();
        System.out.println(parsedHTML);
    }
}

输出:

 <p class="anotherClass"> Here is some text the value is for H<sub>2</sub>) is &gt; 1 and &lt; 100 </p>