以下是如何與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中有太多的怪癖和變化,並且在單個正則表達式中描述它們變得非常迅速。
你是否在運行時取代了這個?或者你只是想在文件系統上替換它? –
我需要在運行時替換它。 – user1431633
不知道用戶會收到編輯通知,所以只是指出我已將更新添加到我的答案中。 :) –