我使用這個正則表達式來數學href's
所有內容的網頁上:正則表達式匹配HREF,但沒有媒體文件
?(?:HREF)= [\「|」](* ?)[\「|'|>] +
它工作正常。但我想只匹配不喜歡媒體的聯繫(PNG | JPG | AVI | WAV | GIF)等
我想是這樣加入
((PNG)?!)。
對我的正則表達式,但這沒有奏效。我讀this question 但無法獲得任何工作解決方案。
我使用這個正則表達式來數學href's
所有內容的網頁上:正則表達式匹配HREF,但沒有媒體文件
?(?:HREF)= [\「|」](* ?)[\「|'|>] +
它工作正常。但我想只匹配不喜歡媒體的聯繫(PNG | JPG | AVI | WAV | GIF)等
我想是這樣加入
((PNG)?!)。
對我的正則表達式,但這沒有奏效。我讀this question 但無法獲得任何工作解決方案。
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);
}
}
我與我的輸入測試的偉大工程......如果您有任何問題,讓我知道..
謝謝,我終於從正則表達式切換到htmlagilitypack - 工作正常。所以這一個是被接受的答案。但其他正則表達式也很好!謝謝大家 – pila
即使我建議反對這種做法,你會發現這個正則表達式的幫助:
(?<=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);
}
我的努力
@"(?<=\shref\s*=\s*[""']?)(?![""']|\S+\.(?:png|jpg|avi|wav|gif)[""']?[\s>])\S+?(?=[""']?[\s>])";
它使用正向後看定位內容和負向視圖,以確保它不包含任何點,然後是可選的引號和一個sp,然後輸入png jpg avi wav gif。王牌或>
。然後匹配,直到一個可選的引號,然後是空格或>
。內容不必被引用,但不得包含空格。
我知道這個問題已經回答了。
我想提供使用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
希望這有助於任何人:)
對於解析基於XML的文檔來說,Regex幾乎不是一個好選擇。但是一旦你獲得了href值,就會實例化一個URI來進行路徑解析。 –
我認爲它比使用htmlagilitypack或其他用於xml解析的更高性能。還是更高效? – pila
性能不是必需的問題,這是事實上,hrefs可以有許多不同的形式,您的代碼可能不會覆蓋,但真正的XML或HTML解析器會。 –