글 작성자: 써니루루

참고 주소 

http://hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=20596&Key=&Value=

http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=32231

 



이 글은 먼저 훈스닷넷(hoons.kr)에 질문으로 올라온 글 덕에 작성해본 코드이고요.

정규표현식(Regular Expression)을 이용해 HTML의 링크에 해당하는 <a href="..." 형태의 URL 부분만 받아오도록 처리하는 방법을 아래 코드로 요약해봅니다.

자세한 주석의 설명은 없지만, () 괄호로 구분되는 정규표현식 테그로 치환되는 값들을 유심히 살펴보시면 됩니다. 

 주석에 나와 있는 숫자 설명은

붉은색으로 강조해 둔 부분에 들어갈 값을 설명한 내용이에요~


(PS. 첨부된 파일은 테스트용 전체 소스에요)

/// <summary>

/// URL을 뽑아온다

/// 0:Link

/// 1:host.domain (FQDN)

/// 2:protocol

/// 3:domain extension (.net, .co.kr, .com ...)

/// 4:port

/// </summary>

/// <param name="strHtml"></param>

/// <returns></returns>

private List<string> GetHrefs(string strHtml)

{

List<string> urlList = new List<string>();

Regex r;

Match m;

 

// ref. url http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=32231

string pattern = string.Empty;

pattern += @"((http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-]+)+(:[0-9]{2,4})?\/?)"; // domain+port

pattern += @"([\.~_0-9a-z-]+\/?)*"; // sub roots or sub directory

pattern += @"(\S+\.[_0-9a-z]+\??)?"; // file & extension string

pattern += @"([_0-9a-z#&=-]+)*"; // parameter

 

r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);

 

for (m = r.Match(strHtml); m.Success; m = m.NextMatch())

{

if (string.IsNullOrEmpty(m.Groups[0].Value))

continue;

 

urlList.Add(m.Groups[0].Value);

}

return urlList;

}