2008-08-25 4 views
3

C# : 하이퍼 링크 및 해당 설명을 구문 분석 할 좋은 정규식이란 무엇입니까?하이 그레 이크 및 설명을 구문 분석 할 정규식

HREF 태그 주위에 대/소문자 구분 안함, 공백 및 작은 따옴표 (큰 따옴표 대신) 사용을 고려하십시오.

<b><i>과 같이 <a> 태그 내에 다른 태그가있는 하이퍼 링크를 얻는 것도 고려하십시오.

답변

6

는, 다음과 같은 변형이 잘 작동합니다

<a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a> 

즉시 중첩 된 태그가 들어올 때 재생, 정규식 파싱에 적합하지 않습니다. 그러나, 당신은 여전히 ​​현대적인 통역사의 고급 기능을 (귀하의 정규식 컴퓨터에 따라) 적용하여 그들을 사용할 수 있습니다. 예 : .NET 정규식은 스택을 사용합니다.

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

출처 : :이 발견 http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

1

I found this 그러나 분명히 these guys에는 약간의 문제가있었습니다.

편집 : (그것은 작동!)
나는 지금 내 자신의 테스트를 수행하고 난 당신이 C#을 대답을 할 수 있도록 내가 C 번호를 모르는, 작동을 발견하지만 PHP를 알고하고있다 여기에 내가이 그것을 실행에서 돌아 왔을 일치하는 배열입니다 :만큼 더 중첩 된 태그 (없이 줄 바꿈)가 없기 때문에

<a href="pages/index.php" title="the title">Text</a> 

array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" } 
1

나는 나는 그것이 여러 주석 내에서 일치 HTML을한다 생각하지만, 대부분의 경우를 처리 have a regex.

.NET 구문을 사용하여 작성되었지만 쉽게 번역 할 수 있어야합니다.

3

대신 깨진 정규식, 당신은 HTML을 구문 분석하고, HTML의 의미를 사용하여 정보를 추출 할 수 The HTML Agility Pack를 사용 StackOverflow: Regular expression for parsing links from a webpage?

에서이 예제를 참조하십시오.

+0

정규 표현식은 훌륭하지만 HTML 또는 XML에서 정규 표현식을 사용하면 고통을 피할 수 있습니다. – slim

+0

+1 HTML 민첩성 팩. 누군가 나에게 이것을 최근에 제안했고 그것은 훌륭하게 일했습니다. – mpen

0

그냥이 스 니펫을 밖으로 던져서 지금 작동 중입니다.이 방법은 이전에 제안했던 것보다 덜 탐욕스러운 버전입니다. 입력에 여러 개의 하이퍼 링크가있는 경우 원래는 작동하지 않습니다. 아래 코드는 모든 하이퍼 링크를 반복 할 수있게합니다 :

static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled); 
public void ParseHyperlinks(string html) 
{ 
    MatchCollection mcHref = rHref.Matches(html); 

    foreach (Match m in mcHref) 
     AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value); 
} 
0

여기에는 균형 잡힌 태그와 일치하는 정규 표현식이 있습니다.

(? : "[ '"']. *?>) (? (?> (?) | (? <-DEPTH>) |)).) +) (? (DEPTH)) (? :)