【问题标题】:Java .split() with regex to match html <a> linksJava .split() 与正则表达式匹配 html <a> 链接
【发布时间】:2011-10-13 11:54:05
【问题描述】:

我需要解析一个字符串并转义除 &lt;a&gt; 链接之外的所有 html 标记。

例如:

"Hello, this is <b>A BOLD</b> bit and this is <a href="www.google.com">a google</a> link"

当在我的 jsp 中打印出来时,我希望看到标签按原样打印出来(即转义,因此页面上的“A BOLD”实际上不是粗体),但 &lt;a&gt; 链接是指向 google 的实际链接在页面上。

我有一个小方法可以根据正则表达式拆分传入的字符串,以匹配各种格式的&lt;a&gt; 链接(带有空格、单引号或双引号等)。正则表达式如下:

myString.split("<a\\s[^>]*href\\s*=\\s*[\\\"\\|\\\'][^>]*[\\\"\\|\\\']\\s*>[^<\\/a>]*<\\/a>");

是的,这很可怕,而且可能效率低下,因此对其他建议持开放态度,但它确实在一定程度上起作用。它失败的地方是解析链接文本位。我希望它接受除&lt;/a&gt; 结束标记之外的任何字符的零次或多次出现,但它会将其解析为除“”之外的任何字符的零次或多次出现",即作为单个字符而不是完整的 &lt;/a&gt; 单词。例如,它与任何带有“e”的文本匹配。

有问题的位是:[^&lt;\\/a&gt;]*

如何更改它以匹配整个单词而不是其组成字符?我试过括号等,但没有任何效果。

【问题讨论】:

  • 你的做法不好。使用真正的解析器。如果是 XHTML,则可以将其解析为 XML。
  • Don't use regex to parse HTML。您可以尝试改用jsoup。
  • 你最好使用 Html 解析器。
  • 我会给 jsoup 一个狂欢。谢谢。
  • @skyuzo +1 只是为了指出另一个问题!!

标签: java html regex


【解决方案1】:

您可以使用jsoup HTML Cleaner with a Whitelist 清理您的HTML,而不会破坏&lt;a&gt; 标签:

String unsafe = 
    "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.addTags("a"));
// now: &lt;p&gtr;<a href="http://example.com/" rel="nofollow">Link</a>&lt;/p&gtr;

【讨论】:

  • 感谢您的指点。我不得不对其进行一些修改以使其正常工作:String dirty = "Hello, testing the &lt;a target=\"_blank\" href ='www.google.com' title=\"blah\"&gt;val&lt;/a&gt; a links &lt;b&gt;to make&lt;/b&gt; sure &lt;hr/&gt; they work.";String cleaned = Jsoup.clean(dirty, new Whitelist().addTags("a").addAttributes("a", "href", "name", "rel", "target")); 不幸的是,这完全去除了不需要的 html。我的要求是转义不需要的 html。我看到 Document 对象上有 OutputSettings ,但这里没有使用。我错过了什么吗?
  • 改用AntiSamy。
【解决方案2】:

虽然我同意 regex 并非旨在解析 xml 的共识意见,但我觉得有时,您只是没有时间学习、实践和实施新概念,一个简单的 regex 可能就足够了你的情况。

如果你有足够的时间,学习 xml 解析器。否则,对于您的问题,这是一个未经测试且可能不是用户证明的正则表达式命题(转义 java 字符串的斜杠):

<\s*(?:[^aA]\b|[a-zA-Z0-9]{2,})[^>]*>

翻译成:

<\s* # less-than character with optional space
(?:  # non capturing group of
  [^aA]\b         # a single letter which is not a nor A 
  |              # or
  [a-zA-Z0-9]{2,} # at least two alphanumeric characters
)
[^>]*> # ... anything until the first greater-than character

【讨论】:

  • jsoup 对于他想要的东西来说真的很简单。
猜你喜欢
  • 2011-02-17
  • 2011-05-13
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多