【发布时间】:2016-06-16 18:55:06
【问题描述】:
我有一个 HTML 代码存储在 Java 代码中的 String 变量中,在这个字符串中我有这样的内容:
<span style="text-decoration: underline;">test</span>
我想要这样的东西
<u>test</u>
或者如果我有这个:
<span style="color: #2873ee; text-decoration: underline;">test</span>
我想要这个:
<font color="#2873ee"><u>test</u></font>
使用正则表达式我可以做到这一点:
affectedString.replaceAll("<span style=\"text-decoration: underline;\">(.*?)<\\/span>", "<u>$1</u>");
和
affectedString.replaceAll("<span style=\"color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}); text-decoration: underline;\">(.*?)<\\/span>", "<u><font color=\"$1\">$2</u></font>");
简单吧?但我有一些问题,我也不喜欢这段代码。 首先,为什么我不喜欢这个?因为我在css中需要用到这个样式的:Underline,Color and Line-through,而且每一种情况巧合都写不好的代码,例如:
affectedString.replaceAll("<span style=\"color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}); text-decoration: underline;\">(.*?)<\\/span>", "<u><font color=\"$1\">$2</u></font>");
affectedString.replaceAll("<span style=\"text-decoration: underline; color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3});\">(.*?)<\\/span>", "<u><font color=\"$2\">$1</u></font>");
问题是这不适用于以下代码:
<span style="text-decoration: underline;">test <span style="text-decoration: line-through;">two</span></span>
在这种情况下,当我尝试应用正则表达式时,该部分匹配到第一个</span>,所以最终结果是:
<u>test<span style="text-decoration:line-through;">two</u></span>
这是当我匹配 text-decoration:underline 时,然后当我匹配 text-decoration:line-through 时。第二个结果是:
<u>test <strike>two</u></strike>
当预期的结果是
<u>test <strike>two</strike></u>
我的问题是,我可以使用什么正则表达式来解决此类问题?还有更好的解决方案可以将那个简单的css“转换”成html标签吗?
谢谢
【问题讨论】:
-
您不应该使用正则表达式来解析 XML/HTML。
-
您或其他回答者为此类任务提供的任何正则表达式都将是复杂的、容易出错的且外观难看。为此,您肯定需要某种 html 分析器/解析器