2010-07-09 80 views
0

我有一个html源代码作为一个字符串变量。 一个单词作为另一个变量,将在该HTML源代码中突出显示。如何在不替换HTML标签的情况下使用ColdFusion替换HTML中的文本?

我需要在标签内正则表达式不突出的标签,但obly文本。

比如我有一个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> 

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

+0

原谅我无知,但我没有追随你想要完成的事情。也许你会得到更好的回应,如果你编辑你的问题,包括你试图得到的实际输出。即: 正文在这里 是你正在试图做什么? – rip747 2010-07-09 12:25:35

+1

还有这个有趣的阅读:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-07-09 15:30:48

回答

3

我需要在标签内的正则表达式,不 没有亮点标签,但obly文本 。

你不会找到一个。没有一个对所有合法/狂野的HTML完全可靠。

简单的原因是,正则表达式匹配Regular languages和HTML甚至不是一个远程正规语言。

即使你非常小心,你跑你不想更换东西的风险,而不是替代的东西,你没有想,只是由于HTML多么复杂的语法就可以了。


解析HTML正确的方法是使用一个特制的HTML DOM解析器。尽管如果您的HTML是XHTML,那么您可以使用XmlParseXmlSearch来允许您仅对与您的文本匹配的文本(不是标签)进行xpath搜索...像//*[contains(text(), 'span')]应该这样做(more details here)。

如果你没有得到XHTML,那么你就需要考虑使用一个Java的HTML DOM解析器 - 谷歌变成了很多,(我还没有尝试任何尚未所以不能给出任何具体的建议)。

+0

+1 - 问题的引用部分相当于“我该如何为工作制造错误的工具来完成工作?” – 2010-07-09 22:05:59

1

你所要做的就是用一个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")> 
+0

你的'(?!/?< )'是从后到前(将匹配'/ <'),'[^。*>]'内部的'。*'是文字字符。但即使纠正了一个微不足道的例子,考虑如何做到这一点......考虑一下' 2010-07-09 17:34:15