HTML / XML은 마크 업과 컨텐츠로 구분됩니다. 정규 표현식은 어휘 태그 구문 분석을 수행 할 때만 유용합니다. 내용을 추론 할 수있을 것 같아요. SAX 파서에 적합합니다. 태그 및 컨텐츠는 요소의 중첩 / 폐쇄를 추적 할 수있는 사용자 정의 함수로 전달 될 수 있습니다.
태그를 구문 분석하는 한 정규 표현식으로 수행 할 수 있으며 문서에서 태그를 제거하는 데 사용할 수 있습니다.
수년간의 테스트를 통해 브라우저가 태그를 구문 분석하는 방식의 비결을 발견했습니다.
일반 요소는 다음 형식으로 구문 분석됩니다.
이 태그의 핵심은이 정규식을 사용합니다.
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
이것을 [^>]?
교대 중 하나로 알 수 있습니다. 이것은 형식이 잘못된 태그의 불균형 따옴표와 일치합니다.
그것은 또한 정규 표현에 대한 모든 악의 단일 뿌리입니다 . 그것이 사용되는 방식은 욕심 많고 일치 해야하는 정량화 된 컨테이너를 만족시키기 위해 충돌을 유발합니다.
수동적으로 사용하면 아무런 문제가 없습니다. 그러나 원하는 속성 / 값 쌍으로 산재하여 무언가를 강제 로 맞추고 역 추적으로부터 적절한 보호를 제공하지 않으면 악의가 없습니다.
이것은 평범한 오래된 태그의 일반적인 형태입니다. (가) 공지 사항 [\w:]
태그 이름을 나타내는? 실제로 태그 이름을 나타내는 유효한 문자는 놀라운 유니 코드 문자 목록입니다.
<
(?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
>
계속해서 모든 태그 를 구문 분석하지 않으면 특정 태그를 검색 할 수 없음을 알 수 있습니다 . 할 수는 있지만 (* SKIP) (* FAIL)과 같은 동사 조합을 사용해야하지만 여전히 모든 태그를 파싱해야합니다.
그 이유는 태그 구문이 다른 태그 등에서 숨겨 질 수 있기 때문입니다.
따라서 모든 태그를 수동으로 구문 분석하려면 아래와 같은 정규식이 필요합니다. 이 특정 내용 은 보이지 않는 내용 과도 일치 합니다.
새로운 HTML이나 xml 또는 다른 어떤 것이 새로운 구조를 개발할 때, 그것을 대안의 하나로 추가하십시오.
웹 페이지 참고-
이 문제가 발생한 웹 페이지 (또는 xhtml / xml)는 본 적이 없습니다. 하나를 찾으면 알려주십시오.
성능 메모-빠릅니다. 이것은 내가 본 가장 빠른 태그 파서
입니다 (아는 사람이 더 빠를 수도 있습니다).
몇 가지 특정 버전이 있습니다. 스크레이퍼로도 탁월
합니다 (실습 형인 경우).
완전한 정규식
<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>
형식화 된 모습
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (1 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (1 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! /> )
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \1 \s*
(?= > )
)
| (?: /? [\w:]+ \s* /? )
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*? )
| (?: \[CDATA\[ [\S\s]*? \]\] )
| (?: -- [\S\s]*? -- )
| (?: ATTLIST [\S\s]*? )
| (?: ENTITY [\S\s]*? )
| (?: ELEMENT [\S\s]*? )
)
)
)
>