【问题标题】:Regex to strip out greater than > and less than < characters from HTML string ignoring existing tags正则表达式从 HTML 字符串中删除大于 > 和小于 < 字符,忽略现有标签
【发布时间】:2015-08-12 15:44:35
【问题描述】:

我对正则表达式没有太多经验,并且有一个问题,我需要用&amp;lt;&amp;gt; 替换所有&gt;&lt; 实例,但要保留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;");

似乎没有任何作用。

我想知道以前是否有其他人遇到过这种情况,或者是否有人可以给我任何指导?

【问题讨论】:

  • Don't even try。使用 HTML 解析器,它将找出那些 &gt;&lt; 字符在哪里(尽可能),然后让它序列化结果。请注意,它是完全有效的,例如,写成&lt;div &gt;foo&lt;/div &gt;
  • 我必须同意。您将无法使用正则表达式处理。
  • 是的,使用解析器。 You have a lot of choices. (其实现在想来,这是格式错误的HTML。符号应该已经被转义了。你基本卡住了,你可能不得不求助于通用的XML解析器,然后整理标签这不是真正的标签。)

标签: java html regex


【解决方案1】:

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

标签之间的裸&amp;lt;符号可以用&lt;(?=[^&gt;]*(?:&lt;|$))找到并替换为&amp;lt;

标签之间的裸&gt;符号可以用((?:^|&gt;)[^&lt;]*?)&gt;找到并替换为\1&amp;gt;

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

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

注意事项:

  • 这只会查找和替换杂散的&amp;lt;&gt; 符号这标签之间,而不是标签本身。这意味着它会搞砸像&lt;a href="/link/with/&lt;/symbol/in/it"&gt; 这样的东西。
  • 如果可行,您应该让人工检查生成的更改的有效性,或者至少通过自动检查器运行。
  • 这些正则表达式耗时,因此如果速度是一个问题,可能不实用。

为了重申其他人的观点,如果使用不受信任的输入进行任何工作,请考虑使用标记解析器。

【讨论】:

  • 这很棒——在某些情况下我会使用解析器。但这对于帮助在数据库内部进行验证可能非常有用。感谢您的宝贵时间
【解决方案2】:

如果所有&amp;lt;&amp;gt;出现在其转义版本(&amp;lt;&amp;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>

【讨论】:

  • 谢谢,这将非常有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2018-05-14
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多