2013-01-24 61 views
1

我使用這個正則表達式來數學href's所有內容的網頁上:正則表達式匹配HREF,但沒有媒體文件

?(?:HREF)= [\「|」](* ?)[\「|'|>] +

它工作正常。但我想只匹配不喜歡媒體的聯繫(PNG | JPG | AVI | WAV | GIF)等

我想是這樣加入

((PNG)?!)。

對我的正則表達式,但這沒有奏效。我讀this question 但無法獲得任何工作解決方案。

+4

對於解析基於XML的文檔來說,Regex幾乎不是一個好選擇。但是一旦你獲得了href值,就會實例化一個URI來進行路徑解析。 –

+0

我認爲它比使用htmlagilitypack或其他用於xml解析的更高性能。還是更高效? – pila

+2

性能不是必需的問題,這是事實上,hrefs可以有許多不同的形式,您的代碼可能不會覆蓋,但真正的XML或HTML解析器會。 –

回答

2
using HtmlAgilityPack; 

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
List<string> href = new List<string>(); 

private void addHREF() 
{ 
    //put your input to check 
    string input = ""; 

    doc.LoadHtml(input); 
    //Which files ignore? 
    string[] stringArray = { ".png", ".jpg" }; 
    foreach (var item in doc.DocumentNode.SelectNodes("//a")) 
    { 
     string value = item.Attributes["href"].Value; 
     if (stringArray.Any(value.Contains) == false) 
      href.Add(value); 
    } 
} 

我與我的輸入測試的偉大工程......如果您有任何問題,讓我知道..

+0

謝謝,我終於從正則表達式切換到htmlagilitypack - 工作正常。所以這一個是被接受的答案。但其他正則表達式也很好!謝謝大家 – pila

1

即使我建議反對這種做法,你會發現這個正則表達式的幫助:

(?<=href\s*=\s*['"]?)(?>(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w\.-]*)*/?)(?<!png|gif|etc) 

(基於8 Regular Expressions You Should Know URL正則表達式)

注意,該表達式將不允許在空間URL。這是因爲HREF的不帶引號將匹配以下屬性(例如,"domain.com/resource.txt title"

例:

static void Main(string[] args) 
{ 

    string l_input = 
     "<a href=\n" + 
     "  \"HTTPS://example.com/page.html\" title=\"match\" />\n" + 
     "<a href='http://site.com/pic.png' title='do not match'> <a href=domain.com/resource.txt title=match>\n" + 
     " <script src=scripts.com/script.js>"; 

    foreach (Match l_match in Regex.Matches(l_input, @"(?<=href\s*=\s*['""]?)(?>(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w\.-]*)*/?)(?<!png|gif|etc)", RegexOptions.IgnoreCase)) 
     Console.WriteLine("'" + l_match.Value + "'"); 

    /* 
    * Returns: 
    * 
    * HTTPS://example.com/page.html 
    * domain.com/resource.txt 
    *   
    */ 

    Console.ReadKey(true); 

} 
1

我的努力

@"(?<=\shref\s*=\s*[""']?)(?![""']|\S+\.(?:png|jpg|avi|wav|gif)[""']?[\s>])\S+?(?=[""']?[\s>])"; 

它使用正向後看定位內容和負向視圖,以確保它不包含任何點,然後是可選的引號和一個sp,然後輸入png jpg avi wav gif。王牌或>。然後匹配,直到一個可選的引號,然後是空格或>。內容不必被引用,但不得包含空格。

+0

這不匹配'href =「http ...」'(空格)。否則,不壞。 – JDB

+0

@ Cyborgx37。更新爲允許'='周圍的空間,並允許非引用內容。 – MikeM

3

我知道這個問題已經回答了。

我想提供使用CsQuery代替HtmlAgilityPack

我覺得語法更緊湊,非常類似於其他結構,因爲它是基於LINQ

//input is your input HTML string 
var links = CQ.Create(input).Find("a").Select(x=>x.Cq().Attr("href")); 

例如不同的方法

var links = CQ.Create("<div><a href='blah'></a><a href='blah2'></a></div>").Find("a").Select(x=>x.Cq().Attr("href")); 
Console.Write(string.Join(",",dom)); //prints blah,blah2 

希望這有助於任何人:)