2012-10-02 30 views
3

使用正則表達式我想提取一些HTML文本中包含的文件或圖像的所有鏈接。試過幾個例子,但他們失敗的原因有很多(是主要的,我不是擅長的正則表達式:))Reg Exp從HTML中提取所有文件

1)首先,我已經試過這樣:

> Regex("<img[^>]+src=[""']([^""']+)[""']", RegexOptions.Singleline Or 
> RegexOptions.IgnoreCase) 

(它的工作原理爲OK圖像)

2),然後將此:

Regex("href=[""']([^""']+)[""']", RegexOptions.Singleline Or RegexOptions.IgnoreCase) 

1)提取所有的圖像,它的工作原理確定但那隻能解決部分問題。 2)提取所有href =「asdf」,但我只想提取指向文件的href,我不想要錨點(#middlesection)或.aspx甚至沒有擴展名的網址,如href =「www.google.com/site 「

我想知道我可以從給定文本中提取的所有文件,作爲一個文件以點結束的三個字符:)

我不感興趣的任何鏈接」的.aspx」或「.html」,既不是像「id_content = 99」這樣的無延伸網址,也不是像「#anchor123」這樣的錨。

是否有可能將此打包成一個RegExp?所有這一切背後的想法是,我必須將某些HTML中引用的每個文件從一個地方複製到另一個地方,因此我需要一個僅包含要複製的文件路徑的ArrayList。

在此先感謝!

增加了一些示例代碼只是爲了澄清,是不是 「野生」 HTML

給予驗證碼:

<p>This is a paragraph</p> 
<br> 
<a href="#someplace">Go to someplace</a> 
<ul> 
    <li><p><a href="../files/document.pdf">Important PDF 1</a></p></li> 
    <li><p><a href="../files/document.xls">Important XLS</a></p></li> 
</ul> 
<a href="content.aspx?id_content=55">Go to content 55</a> 
<br> 
<img src="../images/nicelogo.jpg"> 

我想這一點:

"../files/document.pdf" 
"../files/document.xls" 
"../images/nicelogo.jpg" 

我不想要這個:

"#someplace" 
"content.aspx?id_content=55" 

多數民衆贊成它,與我有的reg exp,我得到所有的鏈接,我只想要那些代表一個文件。 HTML由我手寫(長篇故事),所以不會出現奇怪的雙引號或畸形標籤或奇怪的字符。

我知道它有可能做到這一點,因爲它幾乎完成了,我只是不知道如何告訴「只給我一些有」.something「的匹配,最後是」一個三字符長的字符串「。我清楚了嗎? :)

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

據我所知,RegExp不是完美的解決方案,但在這種情況下不是關於HTML「in w ILD」。我自己編寫HTML,我知道會有src =「../ files/image.jpg」或href =「../ files/document.pdf」,這就是我想要提取的鏈接類型英語的表達將是:給我那些鏈接在src =或href =之後,以點和三個字母(我的文件的定義)忽略其他所有內容結束:)我可以完成這一部分,我錯過了「結束於。和三個字母「由於缺乏RegExp知識 – Remoto

+0

您是否讀過鏈接答案? –

回答

0

像這樣的東西應該工作:

<a href=\"(.*\.[a-z0-9]{3})\" 

,但如果這樣做,你要答應我,你會回來,當你後悔,你用正則表達式這種在這裏評論。

+0

Promised! :)太棒了,它幾乎在那裏!但它不適用於href =「http://www.domain.com/1。htm「,所以我的文件定義必須更改爲」以點和3或4個字符結尾(忘記.xlsx),除了.html .aspx .p​​hp「 – Remoto

+0

承諾並交付,實際上,沒有理智的做法, –

+0

使用你的答案和傑克的我終於到達的答案是: href = \「(。* \。(?:(?:[a-z0-9 ?!。?] {3,4})( Remoto

0

你真的不想嘗試自己解析URL。有各種格式可以參考資源。你可以有src=foo沒有報價,src='foo'src="foo",你可能已包括其本身引用其他資源樣式表,你需要做實體解碼(src='f&quot;oo')和URL編碼(src='f o o'),並與相關處理VS絕對URL(你知道嗎?那src='//somesite.com/blah'是不同於src='http://somesite.com/blah'src='somesite.com/blah'?)等等。還有你提到的問題,可能更多的是我沒有想到的。關於StackOverflow已經有很多問題了,試圖用RegEx解析HTML是一個壞主意,其答案範圍從the serioushumorous

相反,爲什麼不使用已經解決問題的現有工具,如wget?請參閱wget的recursive download支持以關注鏈接並抓取網站以查找參考資源。

+0

感謝您的建議布賴恩,但我完全控制HTML被「解析」,這是因爲我寫了:)所以我知道肯定會有沒有奇怪的字符或'\\',我必須把這個一個VB表單應用程序中的「神奇」正則表達式,我寫了一個更新網站內容的應用程序。所以,看起來很簡單,我無法做出正確的正則表達式來獲取由給定的HTML文本中的任何src和href引用的所有文件:) – Remoto

1

基於你的例子中,表達的大部分不應該匹配一個問號,片段的散列或雙引號:

"([^?#"]*)\.[a-z]{3,4}" 

最後一部分是迫使由一個前面3個4個字符之間的延伸期。

編輯

爲了捕捉部分在雙引號之間:

"(([^?#"]*)\.[a-z]{3,4})" 

不知道如何避免內存捕獲與ASP的基本名稱,在PCRE你會使用?:

+0

Jack,我在答案中使用了可選的3,4個字符,所以您幫助我找到了正確的答案,我需要使用a-z0-9,因爲有文件名爲「document20121002.pdf」,並且避免了?和#沒有必要,因爲這些網址有三種:鏈接到某個地方,錨點或帶有擴展名的文件。感謝您的幫助! – Remoto

+0

@remoto如果這個答案是有用的,考慮投票它,你有enoug代表它我認爲 –