2011-10-06 29 views
0

我想匹配在我的HTML內容,變量的所有鏈接,其中的href開始與http://www.example.com在HTML更換標籤正則表達式這裏的href屬性以http://

應符合:

<a href="http://www.example.com">foo</a>

不應該匹配:

<a href="/bar/">bar</a>

也匹配(與換行符和其他HTML標籤內錨):

<a class="bla" id="blubb" href="http://www.example.com/asdf/" title="oops"> 
<img src="..." alt="" /> 
</a> 

我開始是這樣的:

<CFSAVECONTENT variable="html"> 
    <a class="bla" id="blubb" href="http://www.example.com/asdf/" title="oops"> 
     <img src="..." alt="" /> some Text 
    </a> 
</CFSAVECONTENT> 
<CFSET result = REReplace(html, "<a[^>]*href="http://www\.example\.com[^"]*"[^>]?>([^<]+)</a>", "\1") /> 

但當然這其中不匹配我的最後一個鏈接的例子與在標籤內的img-tag ...

這個的任何提示?

+0

經過進一步調查,問題標題與您所問的內容不符:您是否想要匹配以http://開頭的所有鏈接,或是否所有以http://www.example.com開頭的鏈接?我必須根據你想要的來修改我的答案。 –

+0

它應該匹配所有以http://www.example.com開頭的鏈接 – Seybsen

+0

然後我的回答如下。 –

回答

1

假設:

<CFSAVECONTENT variable="html"> 
    <a class="bla" id="blubb" href="http://www.example.com/asdf/" title="oops"> 
     <img src="..." alt="" /> some Text 
    </a> 
    <a href="http://www.example.com/foo">foo</a> 
    <a href="http://www.yahoo.com">abc</a> 
    <a href="http://www.example.com/bar">bar</a> 
</CFSAVECONTENT> 

使用:

<cfset links = ReMatch('<a[^>]*href="http://www\.example\.com[^"]*"[^>]*>(.+?)</a>', html) /> 

'鏈接' 現在匹配的URL的陣列(錨1,2,和4應該是陣列中)。

請記住,我的答案是根據您想匹配所有以http://www.example.com開頭的錨點爲框架,這可能與您在此問題標題中提出的問題不一定匹配。

+0

謝謝!我現在明白了: \t 」,link)+1,len (鏈接)-find(「>」,鏈接)-4))/> Seybsen

0

嘗試像這樣使用正則表達式對HTML(尤其是如果它不是HTML但是來自Internet的「野性」代碼),可能很困難也很危險,原因很多。

此作業的正確工具是一個HTML解析器,可以提供DOM爲您操作。

不幸的是,沒有任何CF,所以你需要看看Java的。我聽說過好東西Jericho但從來沒有用過它。

+0

定義「危險」。 –

+0

糟糕的正則表達式可能允許JavaScript注入(即跨站腳本)。 –

+0

此外,更可能(但只是'煩人'而不是'危險'),它可能會導致無效的標記,從而使頁面做怪異的事情。 –