首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用CFML删除特定的HTML标记

使用CFML删除特定的HTML标记
EN

Stack Overflow用户
提问于 2018-05-23 21:09:51
回答 1查看 590关注 0票数 4

我需要一个正则表达式来删除<FONT>的所有实例以及它内部可能包含的所有属性,比如<FONT size=2 face=Verdana>及其结束标记</FONT>。我得到的字符串,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">&nbsp;</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>

这是我希望它在使用regex之后的样子:

<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">&nbsp;</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");

我为我糟糕的正则表达式代码道歉,所以任何提示或建议都将非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2018-05-24 14:46:51

正如其他人之前所写的,不要使用REGEX。使用像JSoup这样的超文本标记语言解析器。

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">&nbsp;</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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50489310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档