XML과 HTML을 정규식으로 구문 분석하기 어려운 이유에 대한 몇 가지 예를 제공 할 수 있습니까? [닫은]
하나의 실수 나는 사람들이 만드는 참조 이상 과 다시 정규식으로 XML 또는 HTML을 구문 분석을 시도하고 있습니다. XML과 HTML을 파싱하는 것이 어려운 몇 가지 이유는 다음과 같습니다.
사람들은 파일을 일련의 행으로 취급하려고하지만 유효합니다.
<tag
attr="5"
/>
사람들은 <또는 <tag를 태그의 시작으로 취급하기를 원하지만 다음과 같은 것들이 야생에 존재합니다.
<img src="imgtag.gif" alt="<img>" />
사람들은 종종 시작 태그와 끝 태그를 일치 시키려고하지만 XML과 HTML을 사용하면 태그에 자신을 포함시킬 수 있습니다 (기존 정규 표현식은 전혀 처리 할 수 없음)
<span id="outer"><span id="inner">foo</span></span>
사람들은 종종 문서의 내용 (예 : 유명한 "주어진 페이지에서 모든 전화 번호 찾기"문제)과 일치하기를 원하지만 데이터가 표시 될 때 (정상적으로 보더라도) 표시 될 수 있습니다.
<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>
주석에 형식이 잘못되었거나 불완전한 태그가 포함될 수 있습니다.
<a href="foo">foo</a>
<!-- FIXME:
<a href="
-->
<a href="bar">bar</a>
다른 어떤 문제를 알고 있습니까?
다음은 유용한 XML을 보여줍니다.
<!DOCTYPE x [ <!ENTITY y "a]>b"> ]>
<x>
<a b="&y;>" />
<![CDATA[[a>b <a>b <a]]>
<?x <a> <!-- <b> ?> c --> d
</x>
그리고이 작은 기쁨 묶음은 유효한 HTML입니다.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" [
<!ENTITY % e "href='hello'">
<!ENTITY e "<a %e;>">
]>
<title>x</TITLE>
</head>
<p id = a:b center>
<span / hello </span>
&<br left>
<!---- >t<!---> < -->
&e link </a>
</body>
유효하지 않은 구문에 대한 모든 브라우저 별 구문 분석은 말할 것도 없습니다.
행운을 빕니다.
편집 (Jörg W Mittag) : 다음은 잘 구성된 유효한 HTML 4.01의 또 다른 멋진 부분입니다.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML/
<HEAD/
<TITLE/>/
<P/>
사실은
<img src="imgtag.gif" alt="<img>" />
유효한 HTML이 아니며 유효한 XML도 아닙니다.
'<'및 '>'는 속성 문자열 내에서 유효한 문자가 아니므로 유효한 XML이 아닙니다. 해당 XML 엔티티를 사용하여 이스케이프해야합니다. & lt; & gt;
HTML에서 짧은 닫기 양식이 허용되지 않기 때문에 유효한 HTML이 아닙니다 (XML 및 XHTML에서는 정확함). 'img'태그는 HTML 4.01 사양에 따라 암시 적으로 닫힌 태그이기도합니다. 즉, 수동으로 닫는 것은 실제로 잘못되었으며 다른 태그를 두 번 닫는 것과 같습니다.
HTML의 올바른 버전은
<img src="imgtag.gif" alt="<img>">
XHTML과 XML의 올바른 버전은
<img src="imgtag.gif" alt="<img>"/>
다음 예제도 유효하지 않습니다.
<
tag
attr="5"
/>
이것은 유효한 HTML 또는 XML도 아닙니다. 속성과 닫는 '>'는 원하는 위치에있을 수 있지만 태그 이름은 '<'바로 뒤에 있어야합니다. 유효한 XML은 실제로
<tag
attr="5"
/>
그리고 여기 또 하나 더 펑키 한 것이 있습니다 : 실제로 "또는"를 속성 인용 문자로 사용하도록 선택할 수 있습니다
<img src="image.gif" alt='This is single quoted AND valid!'>
게시 된 다른 모든 이유는 정확하지만 HTML 구문 분석의 가장 큰 문제는 사람들이 일반적으로 모든 구문 규칙을 올바르게 이해하지 못한다는 것입니다. 브라우저가 tagsoup을 HTML로 해석한다고해서 실제로 유효한 HTML을 작성한 것은 아닙니다.
편집 : 심지어 stackoverflow.com도 유효하고 유효하지 않은 정의에 대해 동의합니다. 수정 된 버전이있는 동안 잘못된 XML / HTML이 강조 표시되지 않습니다.
기본적으로 XML은 정규 표현식으로 구문 분석되지 않습니다. 그러나 그렇게 할 이유도 없습니다. 각 언어마다 많은 XML 파서가 있습니다. SAX 파서, DOM 파서 및 풀 파서 중에서 선택할 수 있습니다. 이 모든 것이 정규 표현식으로 구문 분석하는 것보다 훨씬 빠르므로 결과 DOM 트리에서 XPath 또는 XSLT와 같은 멋진 기술을 사용할 수 있습니다.
따라서 내 대답은 다음과 같습니다. 정규 표현식으로 XML을 구문 분석하는 것뿐만 아니라 나쁜 생각이기도합니다. 수백만 개의 기존 XML 파서 중 하나를 사용하고 XML의 모든 고급 기능을 활용하십시오.
HTML은 너무 직접 구문 분석을 시도하기가 너무 어렵습니다. 첫째, 법적인 구문에는 당신이 알지 못하는 작은 미묘함이 많이 있으며, 두 번째로, 야생의 HTML은 단지 거대한 악취 더미입니다. 태그 수프와 같은 HTML을 잘 처리하는 다양한 lax 파서 라이브러리가 있습니다.이를 사용하십시오.
이 주제에 대한 전체 블로그 항목을 작성했습니다 : 정규식 제한
이 문제의 핵심은 HTML과 XML이 재귀 구조이므로 제대로 구문 분석하기 위해 계산 메커니즘이 필요하다는 것입니다. 진정한 정규 표현식은 계산할 수 없습니다. 계산하려면 컨텍스트 프리 문법이 있어야합니다.
이전 단락에는 약간의 경고가 있습니다. 특정 정규식 구현은 이제 재귀 개념을 지원합니다. 그러나 정규 표현식에 재귀를 추가하기 시작하면 경계가 실제로 확장되고 파서를 고려해야합니다.
목록에없는 한 가지는 속성이 어떤 순서로나 나타날 수 있다는 것입니다. 따라서 정규 표현식이 href "foo"및 클래스 "bar"와의 링크를 찾으려면 순서에 관계없이 다른 수를 가질 수 있습니다 그들 사이의 것들.
"구문 분석"의 의미에 따라 다릅니다. 일반적으로 XML 문법은 결코 정규적이지 않기 때문에 정규식을 사용하여 XML을 구문 분석 할 수 없습니다. 간단히 말해서, 정규 표현식은 셀 수 없습니다 (물론, Perl 정규 표현식은 실제로 물건을 계산할 수 있습니다).
사람들은 실제로 정규 표현식을 사용하여 실수를 저지르고 있습니까? 아니면 그들이 달성하려는 작업에 충분합니까?
다른 사람들이 대답 했으므로 정규식을 사용하여 html 및 xml을 구문 분석 할 수 없다는 것에 전적으로 동의합니다.
그러나 요구 사항이 html / xml을 구문 분석하는 것이 아니라 html / xml의 "알려진"비트에서 하나의 작은 비트의 데이터를 얻는 것이라면 정규식 또는 심지어 더 간단한 "하위 문자열"로 충분합니다.
사람들은 일반적으로 욕심 많은 패턴을 쓰는 것을 기본으로 생각하며, 종종 생각할 수없는. * 파일을 대량의 청크를 가능한 가장 큰 <foo>. * </ foo>로 끌어들입니다.
나는 "바퀴를 다시 발명하지 말라"고 유혹하고 있습니다. XML은 실제로 매우 복잡한 형식입니다. 아마 "싱크로 트로트 론을 재발 명하지 마십시오"라고 말해야 할 것입니다.
아마도 올바른 진부한 시작은 "당신이 가진 모든 것이 망치 일 때 ..."정규 표현식을 사용하는 방법을 알고 있는데, 정규 표현식은 구문 분석에 뛰어나므로 XML 구문 분석 라이브러리를 배우는 데 왜 귀찮습니까?
XML 구문 분석이 어렵 기 때문 입니다. XML 파싱 라이브러리를 사용하는 법을 배우지 않아도되는 노력은 많은 창의적 작업과 버그 처리에 의해 만들어 질 것입니다. 귀하를 위해 Google "XML 라이브러리"를 사용하고 다른 사람의 작업을 활용하십시오.
나는 이 고전 이 당신이 찾고있는 정보를 가지고 있다고 생각 합니다 . 의견 중 하나에서 요점을 찾을 수 있습니다.
여기에 결함이 있다고 생각합니다. HTML은 Chomsky Type 2 문법 (문맥이없는 문법)이고 RegEx는 Chomsky Type 3 문법 (정규 표현식)입니다. 유형 2 문법은 유형 3 문법보다 근본적으로 더 복잡하기 때문에이 작업을 수행 할 수는 없습니다 . 그러나 많은 사람들이 시도 할 것이고, 어떤 사람들은 성공을 주장 할 것이고, 다른 사람들은 잘못을 찾아 내고 당신을 완전히 엉망으로 만들 것입니다.
위키피디아의 추가 정보 : Chomsky Hierarchy
문제는 다음과 같이 요약됩니다.
정규식은 거의 부정확합니다. 올바르게 일치하지 않는 합법적 인 입력이 있습니다. 충분히 열심히 일하면 99 % 정확하거나 99.999 %로 만들 수 있지만 XML을 엔티티를 사용하여 허용하는 이상한 것들 때문에 100 % 정확하게 만드는 것은 거의 불가능합니다.
정규식이 정확하지 않은 경우 (0.00001 %의 입력에 대해조차도) 누군가가 애플리케이션을 중단시키는 하나의 입력을 발견 할 수 있기 때문에 보안 문제가 있습니다.
정규식이 99.99 %의 사례를 포괄 할 수있을만큼 정확하다면이를 완전히 읽을 수없고 유지 보수 할 수 없을 것입니다.
보통 크기의 입력 파일에서 정규 표현식이 매우 나쁘게 작동 할 가능성이 큽니다. XML을 처음 접한 것은 들어오는 XML 문서를 올바른 XML 파서로 잘못 분석 한 Perl 스크립트를 대체하는 것이 었으며, 읽을 수없는 코드 300 줄을 누구나 이해할 수있는 100 줄로 바꾸었을뿐만 아니라 사용자 응답 시간을 개선했습니다. 10 초에서 약 0.1 초
일반적으로 XML 문법은 결코 정규적이지 않기 때문에 정규식을 사용하여 XML을 구문 분석 할 수 없습니다. 간단히 말해서, 정규 표현식은 셀 수 없습니다 (물론, Perl 정규 표현식은 실제로 물건을 계산할 수 있습니다).
동의하지 않습니다. 정규식에서 재귀를 사용하면 열기 및 닫기 태그를 쉽게 찾을 수 있습니다.
여기에 내가 먼저 메시지에서 예 분석 오류를 방지하기 위해 정규 표현식의 예를 보여 주었다.
나는이 문제에 대한 간단한 대답을 여기에 주었다 . 100 %를 차지하지는 않지만, 전처리 작업을 기꺼이 수행 할 수있는 방법에 대해 설명합니다.
'Programming' 카테고리의 다른 글
android strings.xml에서 문자 및 문자를 작성하는 방법 (0) | 2020.02.22 |
---|---|
pip 및 요구 사항 파일을 사용하여 특정 패키지를 업그레이드하려면 어떻게해야합니까? (0) | 2020.02.22 |
C ++에 컨텍스트가 없거나 컨텍스트에 민감합니까? (0) | 2020.02.22 |
Windows에 / dev / null이 있습니까? (0) | 2020.02.22 |
Pandas의 map, applymap 및 apply 메소드의 차이점 (0) | 2020.02.22 |