2009-05-12 5 views
0

나는 우리의 커스텀 cms에서 생성 된 페이지의 모든 링크 태그와 일치시킬 수있다.Regex를 사용하여 HTML 링크에서 "Title"속성 가져 오기

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

우리는 C#을 사용하여이 모든 것을 반복하고 각 링크에 onclick 이벤트를 추가한다 (소프트웨어 추적 용) 페이지 내용을 렌더링하기 전에 링크를 구문 분석하고 "링크 이름"인 onclick 함수에 매개 변수를 추가해야합니다.

다음 하위 그룹을 얻으려면 정규식을 수정하려고했습니다.

  • 링크의 제목 특성
  • 링크에 이미지 태그가 포함 된 경우 이미지의 대체 텍스트 얻기
  • 링크 텍스트

그런 다음 링크의 관련 이름을 찾기 위해 각 하위 그룹의 일치를 확인할 수 있습니다.

위의 정규식을 어떻게 수정합니까? 아니면 C# 코드를 사용하여 같은 생각을 할 수 있습니까?

+0

이 페이지를 생성하려면 ASP.NET을 사용하고 있습니까? –

+0

일부 친절한 모드는 어떤 점에서 FAQ에 이것을 추가 하시겠습니까? – annakata

+0

예 ASP.NET을 사용하여 페이지를 생성하고 있습니다 – Sheff

답변

6

HTML을 파싱 할 때 정규 표현식이 근본적으로 나쁩니다 (이유는 Can you provide some examples of why it is hard to parse XML and HTML with a regex? 참조). 필요한 것은 HTML 파서입니다. 다양한 파서를 사용하는 예제는 Can you provide an example of parsing HTML with your favorite parser?을 참조하십시오.

특히 HTMLAgilityPack answer에 관심이있을 수 있습니다.

Regex reg = new Regex("<a[^>]*?title=\"([^\"]*?\"[^>]*?>"); 

개는 몇 :

+0

예 정규 표현식이 html을 파싱 할 때 특히 좋지 않다는 것을 알 수 있습니다. 이유는 (정규 표현식 지식이 부족함에도 불구하고) 저는이 문제로 고민하고 있습니다. 마음에 베어링이 응용 프로그램이 xhtml을 보장 할 수 없다 위의 달성 할 것입니다 좋은 # 파서를 권장해야합니까? – Sheff

+0

미안 해요 HTMLAgilityPack에 앵커를 놓친 것 같아서 고마워요 – Sheff

2

이 시도

  • 이 일치합니다 당신은
  • 이 제목이 모두 존재하는 속성을 기대하는 조정할 수 있습니다, 대소 문자를 구분하고 인용되어있다
    • 물론 제목 속성이 없으면 일치하는 것을 원하지 않을 것이다. 방법?

는 추출 그룹의 컬렉션을 사용하려면 다음과 혼돈에

reg.Match("<a href=\"#\" title=\"Hello\">Howdy</a>").Groups[1].Value 
+0

불행히도 제목 태그가없는 경우 일치하고 싶습니다.이 특정 CMS의 콘텐츠는 매우 열등한 품질의 HTML입니다. 제목이 없으면 확인해야합니다. 이미지 alt 다음 링크 텍스트. – Sheff

0

감사합니다. Owens는 나를 HtmlAgilityPack 라이브러리로 안내해주었습니다. 결국 나는 아래의 내 문제를 해결하는 데 사용. 다른 사람들에게이 라이브러리를 적극적으로 권하고 싶습니다.

HtmlDocument htmldoc = new HtmlDocument(); 
    htmldoc.LoadHtml(content); 
    HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]"); 
    if (linkNodes != null) 
    { 
     foreach (HtmlNode linkNode in linkNodes) 
     { 
      string linkTitle = linkNode.GetAttributeValue("title", string.Empty); 
      //If no title attribute exists check for an image alt tag 
      if (linkTitle == string.Empty) 
      { 
       HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]"); 
       if (imageNode != null) 
       { 
        linkTitle = imageNode.GetAttributeValue("alt", string.Empty); 
       } 
      } 
      //If no image alt tag check for span with text 
      if (linkTitle == string.Empty) 
      { 
       HtmlNode spanNode = linkNode.SelectSingleNode("span"); 
       if (spanNode != null) 
       { 
        linkTitle = spanNode.InnerText; 
       } 
      } 

      if (linkTitle == string.Empty) 
      { 
       if (!linkNode.HasChildNodes) 
       { 
        linkTitle = linkNode.InnerText; 
       } 
      } 

     } 
    } 
+0

나는 그것이 의도 된 것은 아니지만 나는 이것을 좋아한다. "나는 도전적으로 **이 도서관을 다른 사람들에게 추천 할 것이다."* – JDB

관련 문제