如何从ColdFusion字符串中清除HTML标记?

Jas*_*son 11 regex rss coldfusion html-parsing coldfusion-8

我正在寻找一种从ColdFusion字符串中解析HTML标记的快速方法.我们正在提供一个RSS源,它可能包含任何内容.然后我们对信息进行一些操作,然后将其吐回另一个地方.目前我们正在使用正则表达式.有一个更好的方法吗?

<cfloop from="1" to="#ArrayLen(myFeed.item)#" index="i">
  <cfset myFeed.item[i].description.value = 
   REReplaceNoCase(myFeed.item[i].description.value, '<(.|\n)*?>', '', 'ALL')>
</cfloop>
Run Code Online (Sandbox Code Playgroud)

我们正在使用ColdFusion 8.

Tom*_*lak 15

免责声明我是使用适当的解析器(而不是正则表达式)来解析HTML的激烈倡导者.然而,这个问题是不是解析 HTML,而是摧毁它.对于超出该范围的所有任务,请使用解析器.


我认为你的正则表达式很好.只要只从输入中删除所有HTML标记,使用像你这样的正则表达式是安全的.

其他任何东西都可能比它的价值更麻烦,但你可以编写一个小函数,循环遍历字符串char-by-char一次并删除标记括号内的所有内容 - 例如:

  • 一旦遇到" <"字符,立即打开"inTag"标志,
  • 一旦遇到" >" 就把它关掉
  • 只要标志关闭,就将字符复制到输出字符串
  • 为了提高性能,请使用StringBuilder Java对象而不是字符串连接

对于应用程序的高需求部分,这可能比正则表达式更快.但正则表达式很干净,而且可能足够快.

也许这个修改过的正则表达式对你有一些好处:

<[^>]*(?:>|$)
Run Code Online (Sandbox Code Playgroud)
  • 捕获字符串末尾的未闭合标签
  • [^>]* 比...更好 (.|\n)

REReplaceNoCase()当模式中没有实际字母时,不需要使用.不区分大小写的正则表达式匹配比区分大小写更慢.


Pet*_*ton 7

HTML不是常规语言,因此在(不受控制的)HTML上使用正则表达式应该非常小心(如果有的话).

例如,考虑以下有效的HTML段:

<img src="boat.jpg" alt="a boat" title="My boat is > everything! I <3 my boat!">
Run Code Online (Sandbox Code Playgroud)

你会注意到语法高亮显示器是如何窒息的 - 现有的正则表达式也是如此.

除非您可以确定您正在处理的字符串不包含与上述类似的HTML代码,否则您应该避免做出假设/妥协,单一/纯正则表达式路由会强制您这样做.

(注意:同样的问题也适用于建议的char-by-char方法.)


要解决您的问题,您应该使用DOM解析器将您的字符串解析为HTML对象,循环遍历每个元素并转换为文本.

如果你有有效的XHTML,那么你可以使用CF XmlParse()来生成你可以循环的对象.如果它可能是非XML HTML,那么CF8没有内置选项,因此您必须研究Java/etc中的选项.


k.l*_*kos 5

我用这个:

REReplaceNoCase(text, "<[^[:space:]][^>]*>", "", "ALL");
Run Code Online (Sandbox Code Playgroud)

99% 的情况下它工作正常。