문제
씨#:하이퍼링크와 해당 설명을 구문 분석하는 데 좋은 Regex는 무엇입니까?
HREF 태그 주위에 대소문자 구분, 공백 및 작은따옴표(큰따옴표 대신) 사용을 고려하십시오.
또한 <a>
다음과 같은 태그 <b>
그리고 <i>
.
해결책
중첩된 태그가 없고 줄 바꿈도 없는 한 다음 변형이 잘 작동합니다.
<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
다른 팁
다음 예제를 참조하세요. 스택 오버플로:웹페이지의 링크를 구문 분석하는 정규식?
사용 HTML 민첩성 팩 깨진 정규식 대신 HTML의 의미를 사용하여 HTML을 구문 분석하고 세부 정보를 추출할 수 있습니다.
나는 이것을 찾았다 하지만 분명히 이 녀석 그것에 몇 가지 문제가 있었습니다.
편집하다: (효과가있다!)
이제 자체 테스트를 수행한 결과 작동한다는 것을 확인했습니다. 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" }
나 정규식을 가지고 대부분의 경우를 처리하지만 여러 줄 주석 내에서 HTML과 일치한다고 생각합니다.
.NET 구문을 사용하여 작성되었지만 쉽게 번역할 수 있어야 합니다.
이제 이 코드 조각을 작동시키겠습니다. 이것은 이전에 제안한 것보다 덜 탐욕스러운 버전입니다.입력에 여러 개의 하이퍼링크가 있으면 원본이 작동하지 않습니다.아래 코드를 사용하면 모든 하이퍼링크를 반복할 수 있습니다.
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);
}
다음은 균형 잡힌 태그와 일치하는 정규식입니다.
(?:""'[""'].*?>)(?(?>(?)|(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?: )