我需要一个正则表达式来删除<FONT>
的所有实例及其中可能包含的所有属性,例如<FONT size=2 face=Verdana>
及其结束标记</FONT>
。我回来的字符串,字体标记可以包含这些属性的任何属性和值的不同变体,并且html结构不一致。这是我作为字符串得到的一个例子:
<UL>
<LI><FONT size=2 face=Verdana>random text<STRONG>random text</STRONG>random text<SPAN style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><SPAN style="mso-spacerun: yes"> </SPAN>random text</SPAN> </FONT></LI>
<LI><FONT size=2 face=Verdana><FONT size=2 face=Verdana><STRONG>random text</STRONG></FONT></LI> <LI>random text</FONT></LI>
<LI><FONT size=2 face=Verdana>random text</FONT></LI>
<LI><FONT size=2 face=Verdana>random text</FONT></LI>
这是我希望它在使用正则表达式后的样子:
<UL>
<LI>random text<STRONG>random text</STRONG>random text<SPAN style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><SPAN style="mso-spacerun: yes"> </SPAN>random text</SPAN></LI>
<LI><STRONG>random text</STRONG></LI>
<LI>random text</LI>
<LI>random text</LI>
<LI>random text</LI>
我尝试了不同的变体,我已经能够删除<FONT
部分但不删除其属性,结尾>
或结束标记</FONT>
这是我正在使用的一个例子
loc.result = rereplace(arguments.htmlString, "\\<FONT[^*\\>", "", "ALL");
我为我的错误的正则表达式代码道歉,所以任何提示或建议将不胜感激!
答案 0 :(得分:5)
如前所述,不要使用REGEX。使用像JSoup这样的HTML解析器。
Download the JSoup jar file并将其保存在类路径的某个位置,然后使用以下函数(cfscript语法,使用Lucee测试,但应该适用于任何CFML引擎):
<cfscript>
/** removes the given tag from the input html while keeping its contents */
function removeTag(input, tagname){
var Jsoup = createObject("java", "org.jsoup.Jsoup");
var doc = Jsoup.parse(arguments.input);
var body = doc.body().child(0);
var tags = body.select(arguments.tagname);
for (var tag in tags){
for (var attr in tag.attributes().asList())
tag.removeAttr(attr.getKey());
}
var result = body.toString();
result = replace(result, "<#arguments.tagname#>", "", "all");
result = replace(result, "</#arguments.tagname#>", "", "all");
return result;
}
</cfscript>
然后只需使用要清理的HTML代码调用该函数,例如:
cleanHtml = removeTag(inputHtml, "font");
为了测试你的例子,我添加了以下内容:
<cfsavecontent variable="input">
<UL>
<LI><FONT size=2 face=Verdana>random text 1<STRONG>random text 2</STRONG>random text 3<SPAN style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><SPAN style="mso-spacerun: yes"> </SPAN>random text 4</SPAN> </FONT></LI>
<LI><FONT size=2 face=Verdana><FONT size=2 face=Verdana><STRONG>random text 5</STRONG></FONT></LI> <LI>random text 5</FONT></LI>
<LI><FONT size=2 face=Verdana>random text 6</FONT></LI>
<LI><FONT size=2 face=Verdana>random text 7</FONT></LI>
</cfsavecontent>
<cfdump var="#{ output: removeTag(input, "font"), input: input }#">
输出如下:
我建议您还阅读我的博客文章Harnessing the Power of Java in CFML
答案 1 :(得分:4)
正则表达式可以这样制作:<\/?FONT.*?>
(test and example)。
但整体不使用正则表达式进行HTML / XML解析。原因如下:https://stackoverflow.com/a/1732454/2610466
更新:根据问题更好地解决问题