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"标志,>" 就把它关掉对于应用程序的高需求部分,这可能比正则表达式更快.但正则表达式很干净,而且可能足够快.
也许这个修改过的正则表达式对你有一些好处:
<[^>]*(?:>|$)
Run Code Online (Sandbox Code Playgroud)
[^>]* 比...更好 (.|\n)REReplaceNoCase()当模式中没有实际字母时,不需要使用.不区分大小写的正则表达式匹配比区分大小写更慢.
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中的选项.
我用这个:
REReplaceNoCase(text, "<[^[:space:]][^>]*>", "", "ALL");
Run Code Online (Sandbox Code Playgroud)
99% 的情况下它工作正常。