如何替换锚标签的所有href属性中的文本?

时间:2012-08-24 16:13:15

标签: regex coldfusion

我需要替换所有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#">

1 个答案:

答案 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的变化并且在一个正则表达式中描述它们非常快速地变得非常复杂。