我需要替换所有href值中的文本。我认为正则表达式是这样做的,但我不是正则表达式。关于如何使用ColdFusion进行以下操作的任何想法?
<a href="http://www.replace-this-link.com"></a>
所以它改为:
<a href="{replaced}"></a>
谢谢!
以下是对此问题的更新:我有此代码,需要以下模式:
<cfset matches = ReMatch('<a[^>]*href="http[^"]*"[^>]*>(.+?)</a>', arguments.htmlCode) /> <cfdump var="#matches#">
<cfset links = arrayNew(1)>
<cfloop index="a" array="#matches#">
<cfset arrayAppend(links, rereplace(a, 'need regex'," {clickurl}","all"))>
</cfloop>
<cfdump var="#links#">
答案 0 :(得分:1)
以下是使用jSoup HTML parser:
的方法<cfset jsoup = createObject('java','org.jsoup.Jsoup') />
<cfset Dom = jsoup.parse( InputHtml ) />
<cfset Dom.select('a[href]').attr('href','{replaced}') />
<cfset NewHtml = Dom.html() />
(在CF9及更早版本中,这需要将jsoup的jar放在CF的lib目录中,或者使用JavaLoader。)
使用HTML解析器通常比使用正则表达式更好,尤其是因为它更易于维护和理解。
这是使用正则表达式执行此操作的不完美的方式:
<cfset NewHtml = InputHtml.replaceAll
( '(?<=<a.{0,99}?\shref\s{0,99}?=\s{0,99}?)(?:"[^"]+|''[^'']+)(["'])'
, '$1{replaced}$1'
)/>
有希望证明为什么使用像jsoup这样的工具绝对是要走的路......
(顺便说一下,上面是使用Java正则表达式引擎(通过string.replaceAll),所以它可以使用lookbehind功能,这在CF的内置正则表达式中不存在(rereplace / rematch /等))
<小时/> 根据您提供的新代码示例进行更新...
以下是如何使用jsoup进行操作的示例 - 它可能仍需要一些更新(取决于{clickurl}最终将要执行的操作),但它目前的功能与示例代码相同正在尝试:
<cfset jsoup = createObject('java','org.jsoup.Jsoup') />
<cfset links = jsoup.parse( Arguments.HtmlCode )
<!--- select all links beginning http and change their href --->
.select('a[href^=http]').attr('href',' {clickurl}')
<!--- get HTML for all links, then split into array. --->
.outerHtml().split('(?<=</a>)(?!$)')
/>
<cfdump var=#links# />
那个中间位只是一个cfset,但为了清晰起见,我将其拆分并添加了注释。 (当然,如果您愿意,可以使用多个变量和3 + cfsets来执行此操作。)
同样,它不是一个正则表达式,因为你正在做的事情涉及解析HTML,而正则表达式不是为解析基于标记的语法而设计的,因此不是很擅长 - 有太多的怪癖和HTML的变化并且在一个正则表达式中描述它们非常快速地变得非常复杂。