【问题标题】:How can I keep <sup> & <sub> html tags in my coldfusion string but get rid of all other html tags?如何在我的 Coldfusion 字符串中保留 <sup> 和 <sub> html 标签,但摆脱所有其他 html 标签?
【发布时间】:2016-08-07 05:08:58
【问题描述】:

我怎样才能在我的coldfusion字符串中保留&lt;sup&gt;whatever&lt;/sup&gt;&lt;sub&gt;whatever&lt;/sub&gt; html标签,但去掉所有其他html标签?

【问题讨论】:

  • 可能把所有的和改成两个唯一的字符串,然后取出标签,最后把唯一的字符串返回给标签
  • 也可以在 JSoup 上进行搜索。它易于使用,是解析和操作 html 字符串的绝佳工具。
  • 请记住,像建议的 JSoup 这样的 DOM 解析只有在正确构建源内容的情况下才有效。我们使用这种方法的体验很糟糕,因为目标网站会发生变化,有时迟早会出现格式错误。

标签: coldfusion


【解决方案1】:

虽然在 CF 中有很多方法可以运行正则表达式魔法,但我仍然更喜欢这里的一些 Java 来遍历内容和捕获内容。

<!--- string with tags to strip --->
<cfsavecontent variable="stringToStrip">
    <p class="something">
        Hello <sup>World</sup>
    </p>
    <div>
        <div style="border: 1px solid;">foo</div>
        <sub class="example">bar</sub>
    </div>
</cfsavecontent>

<!--- regex to capture all tag occurences --->
<cfset stripRegEx = "<[^>]+>">

<cfset result   = createObject("java", "java.lang.StringBuilder").init()>
<cfset matcher  = createObject("java", "java.util.regex.Pattern").compile(stripRegEx).matcher(stringToStrip)>
<cfset last     = 0>

<cfloop condition="matcher.find()">

    <!--- append content before next capture --->
    <cfset result.append(
        stringToStrip.substring(
            last,
            matcher.start()
        )
    )>

    <!--- full tag capture --->
    <cfset capture = matcher.group(
        javaCast("int", 0)
    )>

    <!--- keep only sub/sup tags --->
    <cfif reFindNoCase("</?su[bp]", capture)>
        <cfset result.append(capture)>
    </cfif>

    <!--- continue at last cursor --->
    <cfset last = matcher.end()>
</cfloop>

<!--- append remaining content --->
<cfset result.append(
    stringToStrip.substring(last)
)>

<!--- final result --->
<cfset result = result.toString()>

<cfoutput>#result#</cfoutput>

输出是:

Hello <sup>World</sup>
foo
<sub class="example">bar</sub>

【讨论】:

  • 这可能有效,但@luke 的建议更简单。
  • @DanBracuk 我不同意。无论如何,他必须剥离所有标签。字符串替换容易出错(如果 sub/sup 标记中有属性,甚至不会起作用)。
【解决方案2】:

我认为您也可以像这样在正则表达式替换中使用负前瞻:

stripped_string = reReplaceNoCase(source_string, '&lt;(?!/?su[bp]\b)[^&gt;]+&gt;', '', 'all' );

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2015-01-23
    • 2010-11-01
    • 1970-01-01
    • 2021-08-21
    • 2016-10-09
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多