【问题标题】:Removing Specific HTML Tags with CFML使用 CFML 删除特定的 HTML 标签
【发布时间】:2018-11-02 11:58:09
【问题描述】:

我需要一个正则表达式来删除<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">&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>

这就是我希望它在使用正则表达式后的样子:

<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>

我尝试了不同的变体,我已经能够删除 &lt;FONT 部分,但不能删除它的属性、结尾 &gt; 或结束标记 &lt;/FONT&gt;

这是我正在使用的示例

loc.result = rereplace(arguments.htmlString, "\\<FONT[^*\\>", "", "ALL");

我为我的错误正则表达式代码道歉,所以任何提示或建议将不胜感激!

【问题讨论】:

  • 这就是为什么你不应该使用正则表达式来解析 HTML Link。话虽如此,请尝试(?:&lt;FONT[^&gt;]*&gt;|&lt;\/FONT&gt;)。见Demo
  • 我不是在尝试解析 html,我只是想删除那些字体标签。
  • 将您的 html 放入 XML 对象并使用 XPath。比使用正则表达式更可靠。当您第一次遇到 html 中包含文本的 html 时,正则表达式将中断,该文本是显示如何使用字体标记的示例代码(例如在
     标记内)。
  • @SamM 你真的会相信 HTML 也是有效的 XML 吗?
  • @JamesAMohler 你是对的,但总有希望。如果 html 太旧以至于仍然使用字体标签,我想我不会屏住呼吸,尽管 html 是有效的 xml。 ;)

标签: regex coldfusion html-parsing cfml lucee


【解决方案1】:

正则表达式可以这样制作:&lt;\/?FONT.*?&gt; (test and example)。

但总体不要使用正则表达式进行 HTML/XML 解析。原因如下:https://stackoverflow.com/a/1732454/2610466

更新:根据对问题的更好理解修正了答案

【讨论】:

    【解决方案2】:

    正如其他人之前写的那样,不要为此使用 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">&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

    【讨论】:

    • 没有足够的 jQuery。
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2012-12-06
    • 2017-07-23
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多