나는 이것을 생각해 냈고 내가 올바르게 이해하고 있는지 확인하고 싶었습니다. az 만 캡처하고 있습니다.
<([az]+) *[^/]*?>
나는 그것이 말한다 :
다음보다 작은 것을 찾으십시오.
az를 한 번 이상 찾아서 캡처한 다음
0개 이상의 공백을 찾은 다음
/ 제외하고 탐욕스러운 문자를 0번 이상 찾은 다음
보다 큰 찾기
나에게 그런 권리가 있습니까? 그리고 더 중요한 것은 어떻게 생각하세요?
정규식으로 [X]HTML을 구문 분석할 수 없습니다. HTML은 정규식으로 구문 분석할 수 없기 때문입니다. Regex는 HTML을 올바르게 구문 분석하는 데 사용할 수 있는 도구가 아닙니다. 이전에 HTML 및 정규식 질문에서 여러 번 답변한 것처럼 정규식을 사용하면 HTML을 사용할 수 없습니다. 정규식은 HTML에서 사용하는 구성을 이해하기에는 충분히 정교하지 않은 도구입니다. HTML은 정규 언어가 아니므로 정규 표현식으로 구문 분석할 수 없습니다. 정규식 쿼리는 HTML을 의미 있는 부분으로 분해할 수 없습니다. 여러 번하지만 그것은 나에게 도달하지 않습니다. Perl에서 사용하는 향상된 불규칙 정규식조차도 HTML 구문 분석 작업에 해당하지 않습니다. 당신은 절대 날 깨게 만들지 않을 것입니다. HTML은 정규 표현식으로 구문 분석할 수 없을 정도로 복잡한 언어입니다. Jon Skeet조차도 정규식을 사용하여 HTML을 구문 분석할 수 없습니다. 정규 표현식으로 HTML을 구문 분석하려고 할 때마다 부정한 아이는 처녀의 피를 흘리고 러시아 해커는 웹 앱을 pwn합니다. 정규식으로 HTML을 구문 분석하면 오염된 영혼을 살아있는 영역으로 소환합니다. HTML과 정규식은 사랑, 결혼, 영아 살해 의식처럼 함께 갑니다. <center>는(는) 너무 늦으면 안 됩니다. 동일한 개념 공간에서 정규식과 HTML을 함께 사용하면 너무 많은 물 같은 퍼티처럼 당신의 마음을 파괴할 것입니다. HTML을 정규식으로 구문 분석하면 기본 다국어 평면에서 이름을 표현할 수 없는 분을 위해 우리 모두를 비인간적인 수고로 파멸시키는 그들의 신성모독적인 방식에 굴복하고 있습니다. HTML-plus-regexp는 당신이 관찰하는 동안 지각 있는 신경을 액화시킬 것입니다. 당신의 정신은 공포의 맹공격에 시들어갑니다. 정규식 기반의 HTML 파서는 너무 늦게 너무 늦게 우리 아이 보장하지만 정규식 (이 같은 이전에 예언 할 수없는 HTML 제외) 모든 살아있는 조직을 소모합니다 사랑하는 주님의 죄를 저장할 수 없습니다입니다 StackOverflow의를 죽이고 암입니다 캔 사람이 구문 분석 HTML에 정규식을 사용하여이 재앙에서 살아남을 방법 도움이 우리가 프로세스 HTML을 도구로 REGE의 X를 사용 공포 고문 및 보안 구멍의 영원에 인류를 파멸 한 같은이 세상과 부패한 기관의 공포 영역 (사이 브리의 채널을 설정 HTML에 대한 등록 전 파서의 세계 그 자체 glimp 단순한) SGML 엔티티하지만, 더 손상된것 인 tantly 전송 AP 통신 rogrammer의 의식 내가 NTO 아 ORL D 끊임없는 비명, 그가 온다의 간악한 SL ithy 정규식 감염 줘야 Visual Basic에서 같은 모든 시간에 대한 HT ML 파서, 응용 프로그램과 존재 바우어 난 더 악화 그가 닷컴ES하지 Fi를 GHT의 시간 전자 제공, HI의 부정 래디언스 드의 모든 깨달음을 stro҉ying, HTML 태그 누수가온다ING에서 요 우르 눈처럼 LIQ UID P는아인이는 SP에서 탈 사람 MOR의 목소리를 nguish exti합니다 ssion 구문 분석 다시 일반 특급의 노래가 여기에 나는 그것이 당신이 아름다운 t은 그것을 볼 수 있습니다 볼 수 있습니다 그 F inal snuf 닐렌 O F 거짓의 사람 ALL이다 잃은LL I SL OST 일 전자 그 S 올 포니그는저 S t공동 ES를 COM 그 ICH 또는 permeat ES 알 L MY FAC E MY FACE의 ᵒh 신, n은 OONO NOOON Θ 정지 t *가 그 ̶͑̾̾ GL ES ͎a̧͈͖r̽̾̈́͒͑e N OT 실제 ZA̡͊͠͝LGΌ ISͮ҉̯͈͕̹̘ T O͇̹̺Ɲ̴ȳ̳ 번째 E PO 뉴욕 올 HE들
대신 XML 파서를 사용해 보셨습니까?
진행자 메모
이 게시물은 콘텐츠에 대한 부적절한 편집을 방지하기 위해 잠겨 있습니다. 게시물은 보이는 대로 정확하게 보입니다. 내용에는 문제가 없습니다. 우리의 주의를 위해 플래그를 지정하지 마십시오.
Community Wiki
정규식만 있는 임의의HTML은 불가능하지만 제한된 알려진 HTML 집합을 구문 분석하는 데 사용하는 것이 적절할 때도 있습니다.
데이터를 스크랩한 다음 데이터베이스에 채우려는 작은 HTML 페이지 세트가 있는 경우 정규 표현식이 제대로 작동할 수 있습니다. 예를 들어, 나는 최근에 의회 웹사이트에서 가져온 호주 연방 하원의원의 이름, 정당, 선거구를 얻고 싶었습니다. 이것은 제한된 일회성 작업이었습니다.
그러나 많은 사람들이 시도하고 일부는 성공을 주장하기도 합니다. 그러나 다른 사람들이 잘못을 찾아 완전히 엉망이 될 때까지.
Community Wiki
이 녀석들의 말을 듣지 마세요. 작업을 더 작은 조각으로 나누면 정규식으로 컨텍스트 없는 문법을 완전히 구문 분석할 수 있습니다. 다음을 순서대로 수행하는 스크립트를 사용하여 올바른 패턴을 생성할 수 있습니다.
정지 문제를 해결합니다.
원을 사각형으로 만듭니다.
O(log n) 이하로 여행하는 세일즈맨 문제를 해결하십시오. 그 이상이면 RAM이 부족하고 엔진이 정지됩니다.
패턴이 꽤 크므로 임의의 데이터를 무손실 압축하는 알고리즘이 있는지 확인하십시오.
거의 다 왔습니다. 전체를 0으로 나누면 됩니다. 쉬워요.
나 자신이 마지막 부분을 완전히 끝내지 못했지만, 나는 내가 가까이 가고 있다는 것을 압니다. CthulhuRlyehWgahnaglFhtagnException 계속 던지므로 VB 6으로 이식하고 On Error Resume Next 입니다. 방금 벽에서 열린 이 이상한 문을 조사하면 코드로 업데이트하겠습니다. 흠.
PS Pierre de Fermat도 방법을 알아냈지만 그가 작성하는 여백이 코드에 비해 충분하지 않았습니다.
Community Wiki
면책 조항 : 옵션이 있는 경우 파서를 사용하십시오. 그 말은...
이것은 HTML 태그와 일치시키기 위해 (!) 사용하는 정규식입니다.
<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>
완벽하지는 않지만 많은 HTML을 통해 이 코드를 실행했습니다. 웹에 표시되는 <a name="badgenerator""> 와 같은 이상한 것도 포착합니다.
자체 포함 태그와 일치하지 않게 하려면 Kobi 의 부정적인 뒤돌아보기를 사용하고 싶을 것입니다.
<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>
또는 그렇지 않은 경우 결합하십시오.
반대 투표자에게: 이것은 실제 제품의 작업 코드입니다. 이 페이지를 읽는 사람이 HTML에서 정규식을 사용하는 것이 사회적으로 용인된다는 인상을 받을지 의심됩니다.
주의 사항 : 이 정규식은 CDATA 블록, 주석, 스크립트 및 스타일 요소가 있는 경우 여전히 중단된다는 점에 유의해야 합니다. 좋은 소식은 정규식을 사용하는 사람들을 제거할 수 있다는 것입니다...
Community Wiki
당신에게 지구가 둥글다고 말할 사람들이 있습니다. 그들은 거짓말을 하고 있다.
정규식은 재귀적이어서는 안 된다고 말하는 사람들이 있습니다. 그들은 당신을 제한하고 있습니다. 그들은 당신을 복종시킬 필요가 있으며, 당신을 무지하게 함으로써 그것을 합니다.
당신은 그들의 현실에 살거나 빨간 약을 먹을 수 있습니다.
Lord Marshal처럼(그는 Marshal .NET 클래스의 친척입니까?) 저는 Underverse Stack Based Regex-Verse를 보고 상상할 수 없는 강력한 지식을 가지고 돌아왔습니다. 네, 올드 한 두 명이 그들을 보호하고 있었던 것 같은데, 그들은 TV로 축구를 보고 있었기 때문에 어렵지 않았습니다.
XML의 경우는 매우 간단하다고 생각합니다. RegEx(.NET 구문에서)는 수축되고 약한 마음이 더 쉽게 이해할 수 있도록 base64로 코딩되어 다음과 같아야 합니다.
설정할 옵션은 RegexOptions.ExplicitCapture 입니다. 찾고 있는 캡처 그룹은 ELEMENTNAME 입니다. 캡처 그룹 ERROR 가 비어 있지 않으면 구문 분석 오류가 있었고 Regex가 중지되었습니다.
사람이 읽을 수 있는 정규식으로 다시 변환하는 데 문제가 있는 경우 다음이 도움이 됩니다.
static string FromBase64(string str) { byte[] byteArray = Convert.FromBase64String(str); using (var msIn = new MemoryStream(byteArray)) using (var msOut = new MemoryStream()) { using (var ds = new DeflateStream(msIn, CompressionMode.Decompress)) { ds.CopyTo(msOut); } return Encoding.UTF8.GetString(msOut.ToArray()); } }
확신이 서지 않는다면 농담이 아닙니다(하지만 아마도 거짓말일 것입니다). 그것은 작동합니다. 나는 그것을 테스트하기 위해 수많은 단위 테스트를 구축했으며 심지어 적합성 테스트 (일부)를 사용했습니다. 완전한 파서가 아닌 토크나이저이므로 XML을 구성 요소 토큰으로만 분할합니다. DTD를 구문 분석/통합하지 않습니다.
이러한 이유로 정규식을 사용하여 XML을 구문 분석할 수 있다고 생각합니다. 그러나 유효한 XML이어야 합니다 ( 브라우저는 HTML을 매우 관대하고 HTML 내부에 잘못된 XML 구문을 허용합니다 ). 이는 "밸런싱 그룹 정의"가 정규식 엔진이 PDA로 작동하도록 허용하기 때문에 가능합니다.
위에 인용된 기사 1에서 인용:
.NET 정규식 엔진
위에서 설명한 대로 적절하게 균형이 잡힌 구성은 정규식으로 설명할 수 없습니다. 그러나 .NET 정규식 엔진은 균형 잡힌 구문을 인식할 수 있도록 하는 몇 가지 구문을 제공합니다.
(?<group>) - 캡처된 결과를 그룹이라는 이름으로 캡처 스택에 푸시합니다.
(?<-group>) - 캡처 스택에서 이름 그룹과 함께 맨 위 캡처를 팝합니다.
(?(group)yes|no) - group이라는 이름의 그룹이 있으면 yes 부분과 일치하고 그렇지 않으면 부분과 일치하지 않습니다.
이러한 구성을 사용하면 기본적으로 푸시, 팝 및 비어 있는 스택 작업의 간단한 버전을 허용하여 .NET 정규식이 제한된 PDA를 에뮬레이트할 수 있습니다. 간단한 연산은 각각 0에 대한 증가, 감소 및 비교와 거의 동일합니다. 이를 통해 .NET 정규식 엔진은 컨텍스트가 없는 언어, 특히 간단한 카운터만 필요한 언어의 하위 집합을 인식할 수 있습니다. 이것은 차례로 비전통적인 .NET 정규식이 개별 적절하게 균형 잡힌 구성을 인식할 수 있도록 합니다.
IgnorePatternWhitespace(정규식을 축소하고 모든 공백을 제거하는 경우 필요하지 않음)
IgnoreCase(필요하지 않음)
정규 표현식 설명(인라인)
(?=<ul\s+id="matchMe"\s+type="square"\s*>) # match start with <ul id="matchMe"... (?> # atomic group / don't backtrack (faster) <!-- .*? --> | # match xml / html comment <[^>]*/> | # self closing tag (?<opentag><(?!/)[^>]*[^/]>) | # push opening xml tag (?<-opentag></[^>]*[^/]>) | # pop closing xml tag [^<>]* # something between tags )* # match as many xml tags as possible (?(opentag)(?!)) # ensure no 'opentag' groups are on stack
속성 값의 구분 기호, 작은 따옴표 또는 큰 따옴표('|"). 패턴에서 작은 따옴표는 PHP 문자열 구분 기호와 일치하기 때문에 이스케이프됩니다. 이 하위 표현식은 참조할 수 있도록 괄호로 캡처됩니다. 속성의 클로저를 구문 분석하기 위해 다시 한 번, 이것이 매우 중요한 이유입니다.
거의 모든 것과 일치하는 속성 값: (.*?); 이 특정 구문에서 탐욕스러운 일치 (별표 뒤의 물음표)를 사용하여 RegExp 엔진은 "예측"과 유사한 연산자를 활성화합니다.
여기에 재미가 있습니다. \4 부분은 패턴에서 이전에 정의된 하위 표현식을 참조하는 역참조 연산자 입니다. 이 경우에는 발견된 첫 번째 속성 구분 기호인 네 번째 하위 표현식을 참조합니다.
0개 이상의 공백 \s*
속성 하위 표현식은 별표로 표시되는 0개 이상의 가능한 발생을 지정하여 여기서 끝납니다.
그러면 태그가 ">" 기호 앞의 공백으로 끝날 수 있으므로 0개 이상의 공백이 \s* 하위 패턴과 일치합니다.
일치시킬 태그는 간단한 ">" 기호로 끝나거나 그 앞에 슬래시를 사용하는 가능한 XHTML 클로저(/>|>)로 끝날 수 있습니다. 물론 슬래시는 정규식 구분 기호와 일치하므로 이스케이프 처리됩니다.
작은 팁: 이 코드를 더 잘 분석하려면 HTML 특수 문자 이스케이프를 제공하지 않았기 때문에 생성된 소스 코드를 살펴보아야 합니다.
Community Wiki
HTML 문서에서 무언가를 빠르게 추출해야 할 때마다 Tidy를 사용하여 XML로 변환한 다음 XPath 또는 XSLT를 사용하여 필요한 것을 얻습니다. 귀하의 경우 다음과 같습니다.
//p/a[@href='foo']
Community Wiki
이전에 HTMLParser 라는 오픈 소스 도구를 사용했습니다. 다양한 방법으로 HTML을 구문 분석하도록 설계되었으며 목적을 잘 수행합니다. HTML을 다른 트리 노드로 구문 분석할 수 있으며 해당 API를 사용하여 노드에서 속성을 쉽게 가져올 수 있습니다. 확인하고 이것이 도움이 될 수 있는지 확인하십시오.
Community Wiki
정규 표현식으로 HTML을 구문 분석하는 것을 좋아합니다. 나는 고의적으로 깨진 바보 HTML을 구문 분석하려고 시도하지 않습니다. 이 코드는 내 주요 파서(Perl 에디션)입니다.
htmlsplit 이라고 하며 각 줄에 하나의 태그 또는 텍스트 청크가 있는 HTML을 줄로 분할합니다. 그런 다음 grep , sed , Perl 등과 같은 다른 텍스트 도구 및 스크립트를 사용하여 해당 줄을 추가로 처리할 수 있습니다. 농담이 아닙니다. :) 즐기세요.
거대한 웹 페이지를 처리하려는 경우 모든 것을 우선적으로 처리하는 Perl 스크립트를 멋진 스트리밍 것으로 다시 지그하는 것은 충분히 간단합니다. 하지만 꼭 필요한 것은 아닙니다.
HTML을 BBCode로 대체하기 위한 몇 가지 멋진 정규식이 여기에 있습니다 . 반대하는 모든 사람들을 위해 그가 HTML을 완전히 구문 분석하려고 하는 것이 아니라 단지 위생적으로 처리하려고 한다는 점에 유의하십시오. 그는 아마도 그의 단순한 "파서"가 이해할 수 없는 태그를 제거할 여유가 있을 것입니다.
많은 사람들이 이미 지적했듯이 HTML은 구문 분석을 매우 어렵게 만들 수 있는 정규 언어가 아닙니다. 이에 대한 나의 해결책은 깔끔한 프로그램을 사용하여 정규 언어로 변환한 다음 XML 파서를 사용하여 결과를 소비하는 것입니다. 이를 위한 좋은 옵션이 많이 있습니다. 내 프로그램은 jtidy 라이브러리와 함께 Java를 사용하여 HTML을 XML로 변환한 다음 Jaxen에서 xpath를 결과로 변환하여 작성되었습니다.
프로그래밍할 때 HTML을 다룰 때, 특히 정확성이 가장 중요한 경우(예: 처리가 보안에 영향을 미칠 수 있는 경우) 일반적으로 정규식 대신 전용 파서와 API를 사용하는 것이 가장 좋습니다. 그러나 나는 XML 스타일 마크업이 정규 표현식으로 처리되어서는 안된다는 독단적인 견해를 갖고 있지 않습니다. 텍스트 편집기에서 일회성 편집을 수행하거나 손상된 XML 파일을 수정하거나 XML처럼 보이지만 완전히 XML이 아닌 파일 형식을 처리할 때와 같이 정규 표현식이 작업을 위한 훌륭한 도구인 경우가 있습니다. 알아야 할 몇 가지 문제가 있지만 극복할 수 없거나 반드시 관련이 있는 것은 아닙니다.
<([^>"']|"[^"]*"|'[^']*')*> 와 같은 간단한 정규식은 내가 방금 언급한 것과 같은 경우에 일반적으로 충분합니다. 모든 것을 고려한 순진한 솔루션이지만 속성 값에서 > 예를 들어, table 태그를 </?table\b([^>"']|"[^"]*"|'[^']*')*> .
좀 더 "고급" HTML 정규식이 어떻게 생겼는지 이해하기 위해 다음은 실제 브라우저 동작과 HTML5 구문 분석 알고리즘을 에뮬레이트하는 상당히 훌륭한 작업입니다.