2012-08-24 125 views
0

我需要替換所有href值中的文本。我認爲正則表達式是這樣做的,但我不是正則表達式。有關如何使用ColdFusion執行以下操作的任何想法?如何替換錨標記的所有href屬性中的文本?

<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

你是否在運行時取代了這個?或者你只是想在文件系統上替換它? –

+0

我需要在運行時替換它。 – user1431633

+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),所以它可以使用逆向功能,它不存在於CF的內置正則表達式中(rereplace/rematch/etc))


更新,根據您所提供的新的代碼示例...

下面是如何使用jsoup對你在做什麼一個例子 - 它可能仍然需要一些更新(視什麼{點擊網址}最終會做),但它目前的功能與您的示例代碼嘗試:

<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中有太多的怪癖和變化,並且在單個正則表達式中描述它們變得非常迅速。

+0

嘿彼得,我有這個選擇我的鏈接,但不知道正則表達式放在循環中rereplace ... ] * href =「http [^」] *「 [^>] *>(。+?)」,arguments.htmlCode)/> \t \t \t user1431633

+0

用該代碼更新問題,我將用固定版本更新此答案。:) –

+0

添加了新代碼(最終回答問題,而不是您的答案)。:) – Sam

相關問題