【发布时间】:2009-03-10 11:19:00
【问题描述】:
我在 Java webapp 中有一个所见即所得的文本区域。用户可以输入文本并设置样式或粘贴一些已经 HTML 格式的文本。
我要做的是链接文本。这意味着,将文本中所有可能的 URL 转换为它们的“工作对应”,即添加 ...。
当我只有纯文本时,此解决方案有效:
String r = "http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?";
Pattern pattern = Pattern.compile(r, Pattern.DOTALL | Pattern.UNIX_LINES | Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(comment);
comment = matcher.replaceAll("<a href=\"$0\">$0</a>"); // group 0 is the whole expression
但问题是当有一些已经格式化的文本时,即它已经有 ... 标签。
所以我正在寻找某种方式让模式不匹配,只要它在两个HTML 标记() 之间找到文本。我已经读过这可以通过lookahead 或lookbehind 实现,但我仍然无法使其工作。我确定我做错了,因为正则表达式仍然匹配。是的,我一直在玩/调试组,将 $0 更改为 $1 等。
有什么想法吗?
【问题讨论】:
-
我想知道还有多少关于这个主题的问题,这样标题的每一个排列都已经存在于 SO 上,人们开始使用之前已经制定的解决方案之一。
-
我花了很多时间在这个上并做了一些研究,但仍然无法弄清楚。堆栈溢出帮助我找到了解决方案,现在整个社区都可以利用这些答案。您的评论不准确且令人反感。
-
我也挑战你向我展示这个问题的一个解决方案,该解决方案已经在 SO 上使用“置换标题”
-
@frank06:我的评论远非不准确。我在这里花了很多时间,我已经看到这个问题至少十次了。显然,整个社区都没有利用它,因为这似乎是不断被问到的。
-
自己看看:google.com/…