从字符串中删除HTML的最佳方法是什么?

3
我最近开始在使用ColdFusion的ReReplace()函数中使用以下正则表达式来去除字符串中的HTML标签。请注意:我不是将其用作防止XSS或SQL注入的保护措施;这只是为了在将字符串显示在HTML标题属性中之前,从其中删除现有且安全的HTML代码。
REReplaceNoCase(str,"<[^>]*>","","ALL")

在一个半相关的问题中我问如何修改我的正则表达式以包括空格和换行符。有人告诉我使用正则表达式来做这件事情是不合适的,参考了这篇文章作为解释。

我强烈怀疑你发布的正则表达式实际上并不起作用。 我建议你不要使用正则表达式来解析HTML,因为HTML不是一种正则语言。 使用HTML解析器代替。(Mark Byers

如果这是真的,那么在显示之前从字符串中删除HTML的适当工具是什么?(请注意,HTML已经安全;输入到数据库之前已进行了消毒)。
我知道HTMLEditFormat()HTMLCodeFormat(),但这两个函数都不能提供我所需的功能;前者将特殊字符替换为它们的HTML转义等效项,而后者则完全相同,但还将字符串包装在一个<pre>标记中。
我想要做的是在显示在HTML标题属性<a title="My string without HTML goes here">...</a>之前清理掉字符串中的HTML和换行符。
有时候HTML是不必要的。例如,你想显示一篇帖子的摘录,但不需要存储其中的HTML。
3个回答

5

我不同意你引用的理由。虽然HTML不应该使用正则表达式进行解析,但是去除标签对于它们来说是完美的。

但是你需要比仅仅使用<[^>]*>更加小心,因为那样会将以下内容转换:

<span title=">">...</span>

转换为格式不正确的形式

">...</span>

所以你需要像<([^">]|"[^"]*"|'[^']*')*>这样的东西。你可以使用字符替换来去掉换行符,而不是使用正则表达式,但如果你更喜欢正则表达式,你可以使用类似于\n的东西(甚至可以将其与上面的内容结合起来使用,但效率会更低)。

Charles,非常感谢您的解释。我会再等一段时间,看看是否可以鼓励更多的输入。您能否澄清一下您所说的“字符替换”是什么意思?有没有特定的函数可以实现这个功能?对这个概念的进一步阐述将不胜感激。 - Mohamad
我在考虑使用Replace(str, '\n', '', 'all') - Charles
Charles,你制作的字符串的问题在于我不能使用它。双引号破坏了函数并导致错误,因为整个正则表达式字符串必须位于双引号之间... 你有什么办法可以解决这个问题吗? - Mohamad
反引号:键入"<([^\">]|\"[^\"]*\"|'[^']*')*>" - Charles
1
使用cfsavecontent将正则表达式保存到变量中。例如: - BallisticPugh
使用cfsavecontent将正则表达式保存到变量中。 - BallisticPugh

1
使用Chilkat HTML解析器chilkat。我们在我的学术项目中使用它来获取HTML页面中的所有内容和超链接,以构建基本搜索引擎。

1

如果HTML片段要包含在标题中,您可能可以通过正则表达式和足够的测试来涵盖所有基础知识。

不过,作为一般提示,如果您必须处理较大的片段,我会使用Java的XML / DOM方式,通过dom4j解析并抓取文本,或者更有可能通过SAX解析器构建结果。

【编辑】当我第一次回答时,我准备写HTML必须合理地格式化,但假设您至少对源代码有一点控制。如果您没有它,我将快速链接到JTidyTagSoup,当然,我没有测试过任何一个,但它们绝对是我用CF消耗真实世界HTML时要测试的第一件事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接