【问题标题】:How do I use ColdFusion to replace text in HTML without replacing HTML tags?如何使用 ColdFusion 替换 HTML 中的文本而不替换 HTML 标签?
【发布时间】:2011-03-13 19:41:27
【问题描述】:

我有一个 html 源代码作为字符串变量。 还有一个单词作为另一个变量,将在该 html 源代码中突出显示。

我需要一个正则表达式,它不会突出显示标签,但会突出标签内的文本。

例如,我有一个类似的 html 源代码

<cfset html =  "<span>Text goes here, forr example it container also **span** </span>" />
<cfset wordToReplace = "span" />
<cfset html = ReReplace(html ,"[^(<#wordToReplace#\b[^>]*>)]","replaced","ALL")>

而我想要得到的是

<span>Text goes here, forr example it container also **replaced** </span>

但我有一个错误。任何提示!

【问题讨论】:

  • 请原谅我的无知,但我并没有遵循您的目标。如果您编辑您的问题以包含您想要获得的实际输出,也许您会得到更好的回应。即:Text在这里是你想要做的吗?
  • 还有这个有趣的阅读:stackoverflow.com/questions/1732348/…

标签: java regex coldfusion html-parsing


【解决方案1】:

我需要一个正则表达式 不是突出显示标签,而是突出显示文本 在标签内。

你不会找到的。对所有合法/野生 HTML 而言,它不是完全可靠的。

原因很简单,正则表达式匹配 Regular languages,而 HTML 甚至不是正则语言。

即使您非常小心,也可能会因为 HTML 语法的复杂性而冒着替换您不想要的东西而不是替换您想要的东西的风险。


解析 HTML 的正确方法是使用专门构建的 HTML DOM 解析器。

令人讨厌的是 CF 没有内置的,但如果您的 HTML 是 XHTML,那么您可以使用 XmlParseXmlSearch 允许您只搜索与您的文本匹配的文本(而不是标签) ... 像 //*[contains(text(), 'span')] 这样的东西应该做 (more details here)。

如果您没有 XHTML,那么您需要考虑使用 Java 的 HTML DOM 解析器 - 谷歌出现了很多,(我还没有尝试过,所以不能给出任何具体的建议)。

【讨论】:

  • +1 - 问题的引用部分相当于,“我怎样才能让错误的工具完成这项工作?”
【解决方案2】:

您需要做的是使用lookahead 来确保您的文本不包含在标签中。授予这可能会写得更好,但它会给你你想要的结果。它甚至会在标签具有属性时进行处理。

<cfset html =  "<span class='me'>Text goes here, forr example it container also **span** </span>" />
<cfset wordToReplace = "span" />
<cfset html = ReReplace(html ,"(?!/?<)(#wordToReplace#)(?![^.*>]*>)","replaced","ALL")>

【讨论】:

  • 您的(?!/?&lt;) 是从后到前的(将匹配/&lt;),而[^.*&gt;] 中的.* 是文字字符。但即使更正了,举一个关于这不起作用的简单例子......考虑一下&lt;img title="spanish &gt; forever" src="span.png" alt="spanish flag" /&gt; 会变成什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2020-12-24
  • 2015-07-22
相关资源
最近更新 更多