2016-10-02 45 views
0

之間我已經有了我的文檔中檢查每href=""這個正則表達式:正則表達式匹配HREF任何=「」但其他兩個標記

\(href\s*=\s*(?:"|')(.*?)(?:"|')) 

現在我希望它匹配所有href唯一的介於<a</a>之間,其他參數仍然允許介於兩者之間。

不匹配:

<base href="http://www.w3schools.com/images/" target="_blank"> 

<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"> 

比賽:

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

<a class="re" href="http://www.w3schools.com/"></a> 

<a href="http://www.w3schools.com/" class="re">This is a link</a> 

在此先感謝,我一直沒能解決這個問題的呢。

+0

嘗試添加的你如何試圖做到這一點的例子。或者在網上搜索更一般的解決方案,即如何匹配出現在X之前和之後的正則表達式字符串。 –

回答

0

注意:由於語言類(普通,堆棧)的限制,這不能100%完成。但基本接近的是:

<a\b[^>]*\shref="([^"]*)"

或者,如果您使用命名的子表達式:

<a\b[^>]*\shref=(?P<QUOTE>["'])(?P<URL>.*?)(?P=QUOTE)

這也將處理撇號分隔的屬性。

最後一個例子也可以寫成:

<a\b[^>]*\shref=(["'])(.*?)(\1)

但記得要使用第二子表達式,而不是第一個。

您是否想要獲取鏈接的名稱並不清楚,但如果您選擇了哪個正則表達式,則可以添加一個簡單的附錄來獲取該名稱。例如,對於命名的子表達式:

<a\b[^>]*\shref=(?P<QUOTE>["'])(?P<URL>.*?)(?P=QUOTE)[^>]*>(?P<NAME>.*?)</a>

+0

對不起,我應該事先說明我需要什麼。我想查找HTML文檔上的所有鏈接並添加一些內容,例如href =「http://google.com」變爲href =「http://website.com?url=http://google.com」。再次,我原諒缺乏信息。這是我第一次在這個網站上。你能幫我找到解決我的確切問題的解決方案嗎? – Mikusch

+0

只需在您選擇的正則表達式的周圍放置更多的括號並進行替換。類似'$ result = preg_replace('〜()* \ shref =「)([^」] *)(「)〜igs','\ 1http://www.website.com?url = \ 2 \ 3',$ page);' – pepak

+0

這似乎並不總能奏效,我假設它與一些網站使用的字符有關,而不是使用'''。 '〜()* \ shref =「| ] * \ shref =')([|'] *)(」|')〜igs'看起來不錯,但仍然有錯誤 – Mikusch