我有一个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>
但我有一个错误。任何提示!
发布于 2010-07-09 17:25:44
我需要一个正则表达式,它不会突出显示标签,但可以突出显示标签内的文本。
你不会找到的。对于所有合法/狂野的HTML来说,它不是完全可靠的。
原因很简单,因为正则表达式与Regular languages匹配,而HTML根本不是一种正则语言。
即使你非常小心,你也会冒着替换掉你不想要的东西,而不是替换你想要的东西的风险,这仅仅是因为HTML语法太复杂了。
解析HTML的正确方法是使用专门构建的HTML DOM解析器。
令人恼火的是CF没有内置的xpath,但是如果您的HTML是XHTML,那么您可以使用XmlParse和XmlSearch来允许您只搜索与您的文本匹配的文本(而不是标记)。像//*[contains(text(), 'span')]
应该做的事情(more details here)。
如果您还没有XHTML,那么您将需要考虑使用用于Java的HTML DOM解析器- Google出现了很多次(我还没有尝试过任何解析器,所以不能给出任何具体的建议)。
发布于 2010-07-09 13:53:40
您需要做的是使用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")>
https://stackoverflow.com/questions/3211937
复制