programing

XHTML 자체 포함 태그를 제외한 열려 있는 태그와 RegEx 일치

cafebook 2023. 4. 8. 09:12
반응형

XHTML 자체 포함 태그를 제외한 열려 있는 태그와 RegEx 일치

다음 시작 태그를 모두 일치시켜야 합니다.

<p>
<a href="foo">

하지만 이것들은 아닙니다.

<br />
<hr class="foo" />

제가 이걸 생각해 냈는데 제가 제대로 된 건지 확인하고 싶었어요. 건 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.a-z.

<([a-z]+) *[^/]*?>

이렇게 써있는 것 같아요

  • 다음보다 작은 것을 찾아라.
  • a-z를 1회 이상 검색(및 캡처)합니다.
  • 0개 이상의 공간을 찾습니다.
  • 욕심쟁이. 단, 0번만 찾으세요. ★★★★★★★★★★★★★★★★,/ (그래서)
  • 보다 큰 것을 발견하다

내 말이 맞나?그리고 더 중요한 건, 어떻게 생각하세요?

[X]를 해석할 수 없습니다.정규식을 사용한HTMLHTML은 regex로 해석할 수 없기 때문입니다.Regex는 HTML을 올바르게 해석하는 데 사용할 수 있는 도구가 아닙니다. 이전에도 HTML 및 regex 질문에서 여러 번 답변했지만 정규 표현은 HTML을 사용할 수 없습니다. 정규 표현은 HTML에서 사용되는 구조를 이해하기에는 충분히 정교하지 않은 도구입니다.HTML은 정규 언어가 아니므로 정규 표현으로 구문 분석할 수 없습니다.Regex 쿼리는 HTML을 의미있는 부분으로 분해할 수 있는 장치가 되어 있지 않습니다. 여러 번이지만 그것은 나에게 영향을 주지 않습니다.Perl에서 사용되는 고급 불규칙 정규 표현도 HTML을 해석하는 작업에 적합하지 않습니다. 당신은 절대 나를 깨트리지 않습니다.HTML은 정규식으로 구문 분석할 수 없을 정도로 복잡한 언어입니다.Jon Sket도 정규 표현을 사용하여 HTML을 구문 분석할 수 없습니다.HTML을 정규 표현으로 해석하려고 할 때마다 그 불경스러운 아이는 처녀들의 피를 흘리고 러시아 해커들은 당신의 웹앱을 공격한다.HTML을 regex로 해석하면 오염된 영혼이 살아 있는 세계로 소환됩니다.HTML과 regex는 사랑, 결혼, 영아 살해처럼 잘 어울린다.<센터>가 유지할 수 없는 시간이 너무 늦었다.같은 개념의 공간에 있는 regex와 HTML의 힘은 당신의 마음을 물처럼 파괴할 것입니다.HTML을 regex로 해석하면 당신은 그들에게 굴복하고 그들의 신성모독적인 방법으로 우리 모두가 기본 다국어 플레인에서 이름을 표현할 수 없는 사람을 위해 비인간적인 노력을 하게 될 것입니다.HTML-plus-regexp는 당신이 관찰하는 동안 당신의 정신은 공포의 맹공에 시들어가는 동안 지각자의 신경을 가라앉힐 것이다.Rege's-based HTML pars는 StackOverflow를 죽이는 암입니다.이러한 chi-ld의 위반으로 인해 regex가 모든 살아있는 조직을 소비할 수 있습니다(HTML은 제외).앞서 예언한 바와 같이) 친애하는 주님께서는 HTML을 해석하기 위해 regex를 사용하여 어떻게 재앙에서 살아남을있는지 우리를 도와주십시오. HTML을 처리하는 도구로서 regex를 사용하여 이 세계와 (SGML 엔티티와 같은) c͒o͛rupt된 엔티티티 사이의 침해를 확립하는 무서운 고문과 보안의 영구적인 구멍으로 인간을 파멸시켰습니다.HTML용 정규 파서의 세계를 살짝 엿보는 것만으로도 프로그래머의 의식이 끊임없는 비명의 세계로 순식간에 이동하게 된다. , 해충의 sl ithy regex-감염은 비주얼 베이직처럼 HTML 파서, 애플리케이션 및 존재를 영원히 먹어치웁니다.그는 오지 않습니다.는 싸우지 않습니다.그는 com's, "h'is unho'ly radia'cé destring all enli"ghtenment, HTML tags lea lea ki'ki'fr'murs. 이온 해석 지구로부터 인간의 목소리소멸시킬 것이다. 나는 그것을 볼 수 있다. 당신은 그것이 아름다운 것을 볼 수 있는가?inal snuf가 올 때 모든 상실되었다. es 그는 co s the ich​or permeates all MY FACE MY FACE ᵒh god no NO NOO̼O​O NΘ stop the an​*̶͑̾̾​̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅s ͎a̧͈͖r̽̾̈́͒͑enot ré ͨaͨl not not̡ ZA not notLG-IS-IS-IS-STO-SO-N-Y-H-C


대신 XML 파서를 사용해 본 적이 있습니까?


의장의 메모

이 게시물은 내용이 부적절하게 편집되지 않도록 잠겨 있습니다.게시물은 보이는 그대로 표시되며 내용에는 문제가 없습니다.우리의 주의를 끌지 말아주세요.

정규식만 포함하는 임의 HTML은 불가능하지만, 제한된 알려진 HTML 집합을 구문 분석하는 데 사용하는 것이 적절할 수 있습니다.

데이터를 긁어모으고 데이터베이스에 넣을 HTML 페이지의 작은 세트가 있는 경우 정규식은 정상적으로 동작할 수 있습니다.예를 들어, 저는 최근 호주 연방 하원의원의 이름, 정당, 지역구 등을 알고 싶었습니다.이것은 의회 웹사이트에서 얻은 것입니다.이것은 제한된 일회성 직업이었다.

Regexes는 나에게 잘 작동했고, 셋업이 매우 빨랐다.

HTML은 촘스키 타입 2 문법(콘텍스트 자유 문법)이고 정규 표현은 촘스키 타입 3 문법(정규 문법)인 것이 흠이라고 생각합니다.타입 2 문법은 타입 3 문법에 비해 근본적으로 복잡하기 때문에(촘스키 계층 참조) 이것을 실행할 수 없습니다.

하지만 많은 사람들이 시도하고, 어떤 사람들은 심지어 성공을 주장할 것이다. 하지만 다른 사람들이 잘못을 발견하고 당신을 완전히 망칠 때까지 말이다.

면책사항: 옵션이 있는 경우 파서를 사용합니다.그 말은...

HTML 태그를 대조하기 위해 사용하는 정규식(!)입니다.

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>

완벽하지 않을 수도 있지만, 는 많은 HTML을 통해 이 코드를 실행했다. 주의하라, 그것은 심지어 다음과 같은 이상한 것들을 잡아낸다.<a name="badgenerator"">웹에 표시됩니다.

자기포함 태그와 일치하지 않도록 하려면 Kobi의 부정적인 뒷모습을 사용하는 것이 좋습니다.

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>

아니면 그냥 합칠 수도 있고 아닐 수도 있습니다.

다운보터:이것은 실제 제품의 작업 코드입니다.나는 이 페이지를 읽는 사람이 HTML에서 정규식을 사용하는 것이 사회적으로 용인될 수 있다는 인상을 받을지 의심스럽다.

주의: 이 정규식은 CDATA 블록, 코멘트, 스크립트 및 스타일 요소가 존재해도 여전히 고장납니다.좋은 소식은, 정규식을 사용해서 그것들을 없앨 수 있다는 거야...

지구가 둥글다고 말해주는 사람들이 있다.그들은 거짓말을 하고 있다.

정규식은 재귀적이어서는 안 된다고 말하는 사람이 있습니다.그들은 당신을 제한하고 있어요.그들은 당신을 정복해야 합니다. 그리고 그들은 당신을 무지로 유지함으로써 그렇게 합니다.

그들의 현실 속에서 살 수도 있고, 빨간 약을 먹을 수도 있어요.

Lord Marshal처럼 (그는 Marshal의 친척이다.)NET 클래스?)는, 언더버스 스택 기반 Regex-Vers와 함께 반환됨 파워 상상조차 할 수 없는 지식.네, 보호해주는 올드 원이나 두 명 정도 있었던 것 같은데, TV로 미식축구를 보고 있어서 어렵지 않았어요.

XML의 케이스는 매우 간단하다고 생각합니다.RegEx(의 경우).NET 구문)은 base64에서 감압되어 코드화되어 약한 정신으로 이해하기 쉽도록 하기 위해 다음과 같이 해야 합니다.

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
+r/vD34mUADO1P4/AQAA//8=

설정하는 옵션은 다음과 같습니다.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 또는 전체 플레인 정규식을 토큰화하는 regex

셸에서는 sed를 사용하여 HTML을 해석할 수 있습니다.

  1. 튜링
  2. HTML 파서 쓰기(숙제)
  3. ???
  4. 이익!

관련(regex 일치를 사용하지 않는 이유):

XML, 특히 HTML을 해석하는 데 적합한 툴은 정규 표현 엔진이 아닌 파서라는 데 동의합니다.그러나 다른 사람들이 지적한 바와 같이 데이터 형식을 알고 있으면 정규식을 사용하는 것이 더 빠르고 쉽고 작업을 완료할 수 있습니다.

Microsoft 에는, 「Best Practices for Regular Expressions」의 항이 있습니다.NET Framework 및 구체적으로 입력 소스의 검토에 대해 설명합니다.

정규 표현에는 제한이 있지만 다음 사항을 고려했습니까?

.NET 프레임워크는 Balancing Group Definitions를 지원한다는 점에서 정규 표현과 관련하여 고유합니다.

따라서 정규 표현을 사용하여 XML을 해석할 수 있다고 생각합니다., 유효한 XML이어야 합니다(브라우저는 HTML에 대해 매우 관대하며 HTML 내에서 잘못된 XML 구문을 허용합니다).이는 "Balancing Group Definition(밸런싱 그룹 정의)"을 통해 정규 표현 엔진을 PDA로 작동할 수 있기 때문에 가능합니다.

위에서 인용한 기사 1의 인용:

.NET 정규 표현 엔진

위에서 설명한 바와 같이 적절하게 균형 잡힌 구조는 정규 표현으로 설명할 수 없습니다.하지만, 그.NET 정규 표현 엔진은 균형 잡힌 구조를 인식할 수 있는 몇 가지 구성을 제공합니다.

  • (?<group>) 를 이름 푸시합니다 는 스택의 이름을 지정합니다.
  • (?<-group>)에서 이름 많은 를 팝합니다 는 스택에서 캡처를 .
  • (?(group)yes|no)그 이외의 부분은 하지 않습니다 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네.무배역

이러한 구성에서는 를 사용할 수 있습니다.NET 정규 표현은 기본적으로 push, pop 및 empty라는 간단한 버전의 스택 조작을 허용함으로써 제한된 PDA를 에뮬레이트합니다.단순 연산은 각각 증가, 감소 및 0과 거의 동일합니다.그러면 가 허용됩니다.NET 정규 표현 엔진: 컨텍스트프리 언어의 서브셋(특히 단순한 카운터만 필요한 언어)을 인식합니다.이것에 의해, 종래와는 다른 것이 가능하게 됩니다.NET 정규 표현식을 사용하여 적절하게 균형 잡힌 개별 구성을 인식합니다.

다음 정규 표현을 고려합니다.

(?=<ul\s+id="matchMe"\s+type="square"\s*>)
(?>
   <!-- .*? -->                  |
   <[^>]*/>                      |
   (?<opentag><(?!/)[^>]*[^/]>)  |
   (?<-opentag></[^>]*[^/]>)     |
   [^<>]*
)*
(?(opentag)(?!))

플래그를 사용합니다.

  • 한 줄
  • IgnorePattern(무시 패턴)공백(regex를 축소하고 모든 공백을 제거하는 경우 필요 없음)
  • Ignore Case(불필요)

정규 표현 설명(인라인)

(?=<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

A Better에서 시험해 볼 수 있습니다.NET 정규 표현 테스터.

다음 샘플 소스를 사용했습니다.

<html>
<body>
<div>
   <br />
   <ul id="matchMe" type="square">
      <li>stuff...</li>
      <li>more stuff</li>
      <li>
          <div>
               <span>still more</span>
               <ul>
                    <li>Another &gt;ul&lt;, oh my!</li>
                    <li>...</li>
               </ul>
          </div>
      </li>
   </ul>
</div>
</body>
</html>

일치하는 항목을 찾았습니다.

   <ul id="matchMe" type="square">
      <li>stuff...</li>
      <li>more stuff</li>
      <li>
          <div>
               <span>still more</span>
               <ul>
                    <li>Another &gt;ul&lt;, oh my!</li>
                    <li>...</li>
               </ul>
          </div>
      </li>
   </ul>

이렇게 나왔는데

<ul id="matchMe" type="square">           <li>stuff...</li>           <li>more stuff</li>           <li>               <div>                    <span>still more</span>                    <ul>                         <li>Another &gt;ul&lt;, oh my!</li>                         <li>...</li>                    </ul>               </div>           </li>        </ul>

마지막으로, Jeff Atwood의 기사 "Parsing Html The Cthulhu Way"는 정말 재미있었습니다.재미있게도, 현재 4천 표가 넘는 이 질문에 대한 답을 인용하고 있다.

PHP의 XML과 HTML을 해석하기 위해 QueryPath를 사용할 것을 권장합니다.기본적으로 jQuery와 거의 동일한 구문이지만 서버 쪽에 있습니다.

정규식을 사용하여 HTML을 구문 분석할 수 없는 답변은 맞지만 여기에는 적용되지 않습니다.OP는 정규식을 사용하여 하나의 HTML 태그를 구문 분석하려고 합니다.이것은 정규식을 사용하여 수행할 수 있는 것입니다.

단, 제안된 regex가 잘못되었습니다.

<([a-z]+) *[^/]*?>

으로써 regex의 , regex의 경우, regex의 경우, regex의 경우, regex의 경우, regex의 경우, regex의 , regex의 경우, legex의 legex의 경우, legex의 경우, legex의 경우, legex의 경우, legex의 경우, legex의 경우 등, legex의 경우, legex의 경우 등, legex의 , legex의 경우, legex의 경우 등, lege<a >>,[^/], 「 」, 「라고 하는 도 주의해 주세요.<space>*[^/]* 이 용장성이 있기 때문입니다.[^/]*는 공백과 일치할 수도 있습니다.

제가 제안하는 것은

<([a-z]+)[^>]*(?<!/)>

서 ★★★★★(?<! ... )(Perl regexes) 。그 그 뒤에 <, >가 아닌 것, 그 뒤에 >'a <, > > > > > > > > > 、 > 、 [ / ] 、 ." / 가 、 > ."."."." 라고 되어 있습니다.

'먹다'는 '먹다'는 '먹다'는 '먹다'와 같은 을 할 수 있다'는 해 주세요.<a/ >(원래 regex와 마찬가지로) 보다 제한적인 것을 원할 경우 공백으로 구분된 Atribute 쌍을 일치시키는 regex를 구축해야 합니다.

고대 중국의 전략가이자 장군이자 철학자인 손자(孫子)는 이렇게 말했다.

적을 알고 자신을 알면 백전백승이라고 합니다.만약 당신이 당신 자신만을 알고 상대방을 알지 못한다면, 당신은 이길 수도 있고 질 수도 있다.자신이나 적을 모르면 항상 위험에 처하게 된다.

이 경우 적은 HTML이며 사용자는 자신 또는 regex 중 하나입니다.정규식이 불규칙한 Perl일 수도 있습니다.HTML을 알고 자신을 알아라.

HTML의 성질을 나타내는 하이쿠를 작곡했습니다.

HTML has
complexity exceeding
regular language.

Perl의 regex의 성질을 나타내는 haiku도 작성했습니다.

The regex you seek
is defined within the phrase
<([a-zA-Z]+)(?:[^>]*[^/]*)?>

시험:

<([^\s]+)(\s[^>]*?)?(?<!/)>

, 입니다.> 「」를 받아들입니다.h1.

<?php
$selfClosing = explode(',', 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed');

$html = '
<p><a href="#">foo</a></p>
<hr/>
<br/>
<div>name</div>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
    $nodeName = strtolower($el->nodeName);
    if ( !in_array( $nodeName, $selfClosing ) ) {
        var_dump( $nodeName );
    }
}

출력:

string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"

기본적으로 스스로 닫히는 요소 노드 이름을 정의하고 HTML 문자열 전체를 DOM 라이브러리에 로드하여 모든 요소를 캡처하고, 스스로 닫히지 않는 요소를 루프 통과시켜 필터링합니다.

이 용도로 regex를 사용하면 안 된다는 것을 이미 알고 있을 것입니다.

정확한 필요성은 모르겠습니다만, 사용하시는 경우도 마찬가지입니다.NET, Html Agility Pack을 사용할 수 없습니까?

발췌:

그것은 입니다.「Out of the Web」HTML 파일을 해석할 수 있는 NET 코드 라이브러리.파서는 "실제" 잘못된 형식의 HTML에 대해 매우 관용적입니다.

번째 첫첫 the the the the the the the the the ?>에는 'a'가 /자세한 내용은 여기를 참조하십시오.부정적인 뒷모습이라고 하죠.

그 에서는, 「 」, 「 」, 「 」의 매칭이 됩니다.<bar/></foo>에서는, 「」를 참조해 주세요.

<foo><bar/></foo>

해결하려는 문제에 대해 좀 더 자세히 말씀해 주시겠습니까?태그를 통해 프로그램적으로 반복하고 있습니까?

PHP에 필요한 경우:

PHP DOM 함수는 XML이 제대로 포맷되지 않으면 제대로 작동하지 않습니다. 나머지 인류에게 얼마나 더 나은 사용법을 사용하든 상관없습니다.

simplehtmldom도 좋지만, 조금 버그가 있는 것을 알았습니다.메모리는 꽤 무겁습니다.[큰 페이지에서 크래시 됩니다]

쿼리 패스를 사용한 적이 없기 때문에 그 유용성에 대해서는 코멘트할 수 없습니다.

또 하나 시도해 볼 수 있는 것이 DOMParser입니다.DOMParser는 리소스를 매우 가볍게 사용하여 오랫동안 즐겁게 사용하고 있습니다.심플하고 파워풀.

Python과 Java의 경우 유사한 링크가 게시되었습니다.

다운보터의 경우 - XML 파서가 실제 사용을 견딜 수 없을 때만 클래스를 작성했습니다.종교적 다운 투표는 유용한 답변이 게시되는 것을 방해할 뿐입니다. 질문에 대한 관점을 유지하십시오.

해결책은 다음과 같습니다.

<?php
// here's the pattern:
$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*(\/>|>)/';

// a string to parse:
$string = 'Hello, try clicking <a href="#paragraph">here</a>
    <br/>and check out.<hr />
    <h2>title</h2>
    <a name ="paragraph" rel= "I\'m an anchor"></a>
    Fine, <span title=\'highlight the "punch"\'>thanks<span>.
    <div class = "clear"></div>
    <br>';

// let's get the occurrences:
preg_match_all($pattern, $string, $matches, PREG_PATTERN_ORDER);

// print the result:
print_r($matches[0]);
?>

자세히 테스트하기 위해 문자열 자동 닫기 태그를 다음과 같이 입력했습니다.

  1. <hr/>
  2. <br/>
  3. <br>

다음 태그도 입력했습니다.

  1. 1개의 속성
  2. 복수의 어트리뷰트
  3. 이 작은 따옴표 또는따옴표로 묶이는 속성
  4. 딜리미터가 큰따옴표 또는 그 반대인 경우 작은따옴표를 포함하는 속성
  5. "=" 기호 앞, 기호 앞 및 기호 앞뒤에 공백이 있는 "불규칙" 속성.

위의 개념 실증에서 효과가 없는 것이 발견되면 코드 분석을 통해 스킬 향상을 도모할 수 있습니다.

<EDIT> 사용자로부터의 질문이 셀프 클로징 태그의 해석 회피라는 것을 잊고 있었습니다.이 경우 패턴은 다음과 같이 심플해집니다.

$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*>/';

사용자 @ridgerunner는 패턴이 따옴표로 묶이지 않은 속성 또는 값이 없는 속성을 허용하지 않음을 발견했습니다.이 경우 미세 조정은 다음과 같은 패턴을 가져옵니다.

$pattern = '/<(\w+)(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\5\s*)?)*\s*>/';

</편집>

패턴의 이해

패턴에 대해 자세히 알고 싶은 사람이 있다면 다음 행을 제공합니다.

  1. 첫 번째 서브 표현(\w+)이 태그 이름과 일치합니다.
  2. 아트리뷰트성성: :
    1. 1개 이상의 공백 \s+
    2. 속성 이름(\w+)
    3. 0 또는 그 이상의 공백 \s*(여기에는 공백이 남습니다)
    4. "=" 기호
    5. 다시 한 번, 0 이상의 공백
    6. 속성 값의 딜리미터(단일 따옴표 또는 이중 따옴표('|'))를 지정합니다.패턴에서 단일 따옴표는 PHP 문자열 구분 기호와 일치하므로 이스케이프됩니다.이 하위 표현식은 괄호로 캡처되므로 속성의 닫힘을 해석하기 위해 다시 참조할 수 있습니다.그 때문에 매우 중요합니다.
    7. 이 특정 구문에서는 RegExp 엔진은 gready match(아스터리스크 뒤에 물음표)를 사용하여 이 서브 표현식 뒤에 나오는 것을 제외한 모든 것과 일치하는 "look-ahead"와 같은 연산자를 사용할 수 있습니다.
    8. 여기서 재미: \4 부분은 패턴에서 이전에 정의된 하위 표현식을 참조하는 역참조 연산자이며, 이 경우, 나는 발견된 첫 번째 속성 구분 기호인 4번째 하위 표현식을 참조합니다.
    9. 0 이상의 공백 \s*
    10. 아트리뷰트 서브 표현은 여기서 끝납니다.아스타리스크에 의해 지정될 가능성이0 이상입니다.
  3. 그런 다음 태그는 ">" 기호 앞에 공백으로 끝날 수 있으므로 \s* 하위 패턴과 0 이상의 공백이 일치합니다.
  4. 일치하는 태그는 단순한 ">" 기호로 끝나거나 슬래시를 사용하는 XHTML 닫힘으로 끝날 수 있습니다(/>|>).슬래시는 정규 표현 딜리미터와 일치하므로 당연히 이스케이프됩니다.

힌트: HTML 특수문자 이스케이프를 제공하지 않았기 때문에 이 코드를 더 잘 분석하려면 생성된 소스 코드를 살펴봐야 합니다.

HTML 문서에서 빠르게 추출해야 할 때는 항상 Tidy를 사용하여 XML로 변환한 후 XPath 또는 XSLT를 사용하여 필요한 것을 얻습니다.당신의 경우, 다음과 같습니다.

//p/a[@href='foo']

저는 예전에 HTMLParser라는 오픈 소스 툴을 사용했습니다.HTML을 다양한 방법으로 해석하도록 설계되어 목적에 매우 적합합니다.HTML을 다른 3극으로 해석할 수 있으며, API를 사용하여 노드로부터 속성을 쉽게 얻을 수 있습니다.이것이 당신에게 도움이 되는지 확인해 보세요.

HTML을 정규 표현으로 해석하는 것을 좋아합니다.나는 의도적으로 망가진 바보 HTML을 해석하려고 하지 않는다.이 코드가 메인 파서(Perl 에디션):

$_ = join "",<STDIN>; tr/\n\r \t/ /s; s/</\n</g; s/>/>\n/g; s/\n ?\n/\n/g;
s/^ ?\n//s; s/ $//s; print

이것은 htmlsplit이라고 불리며 HTML을 한 줄에 하나의 태그 또는 텍스트 청크로 구분합니다.그런 다음 grep, sed, Perl 등의 다른 텍스트 도구 및 스크립트를 사용하여 행을 더 처리할 수 있습니다.농담도 아니고 :) 즐기세요.

방대한 웹 페이지를 처리하고 싶다면, 우선 Perl 스크립트를 멋진 스트리밍으로 바꾸는 것은 간단하다.하지만 꼭 그럴 필요는 없어요.

HTML 분할


보다 나은 정규 표현:

/(<.*?>|[^<]+)\s*/g    # Get tags and text
/(\w+)="(.*?)"/g       # Get attibutes

XML/XHTML에 적합합니다.

약간의 변형으로 복잡한 HTML에 대처할 수도 있고 HTML -> XHTML을 먼저 변환할 수도 있습니다.


정규 표현을 쓰는 가장 좋은 방법은 불투명한 한 줄 또는 여러 줄의 주석을 달지 않는 Lex / Yacc 스타일입니다.난 아직 여기서 그걸 하지 않았어. 이 사람들은 거의 필요 없어.

HTML을 BBCode로 대체하기 위한 몇 가지 좋은 정규식이 여기에 있습니다.반대하시는 모든 분들을 위해 그가 HTML을 완전히 해석하려는 것이 아니라 단지 삭제하려는 것임을 유의하시기 바랍니다.그는 아마도 그의 단순한 "파서"가 이해할 수 없는 태그를 없앨 여유가 있을 것이다.

예를 들어 다음과 같습니다.

$store =~ s/http:/http:\/\//gi;
$store =~ s/https:/https:\/\//gi;
$baseurl = $store;

if (!$query->param("ascii")) {
    $html =~ s/\s\s+/\n/gi;
    $html =~ s/<pre(.*?)>(.*?)<\/pre>/\[code]$2\[\/code]/sgmi;
}

$html =~ s/\n//gi;
$html =~ s/\r\r//gi;
$html =~ s/$baseurl//gi;
$html =~ s/<h[1-7](.*?)>(.*?)<\/h[1-7]>/\n\[b]$2\[\/b]\n/sgmi;
$html =~ s/<p>/\n\n/gi;
$html =~ s/<br(.*?)>/\n/gi;
$html =~ s/<textarea(.*?)>(.*?)<\/textarea>/\[code]$2\[\/code]/sgmi;
$html =~ s/<b>(.*?)<\/b>/\[b]$1\[\/b]/gi;
$html =~ s/<i>(.*?)<\/i>/\[i]$1\[\/i]/gi;
$html =~ s/<u>(.*?)<\/u>/\[u]$1\[\/u]/gi;
$html =~ s/<em>(.*?)<\/em>/\[i]$1\[\/i]/gi;
$html =~ s/<strong>(.*?)<\/strong>/\[b]$1\[\/b]/gi;
$html =~ s/<cite>(.*?)<\/cite>/\[i]$1\[\/i]/gi;
$html =~ s/<font color="(.*?)">(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<font color=(.*?)>(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<link(.*?)>//gi;
$html =~ s/<li(.*?)>(.*?)<\/li>/\[\*]$2/gi;
$html =~ s/<ul(.*?)>/\[list]/gi;
$html =~ s/<\/ul>/\[\/list]/gi;
$html =~ s/<div>/\n/gi;
$html =~ s/<\/div>/\n/gi;
$html =~ s/<td(.*?)>/ /gi;
$html =~ s/<tr(.*?)>/\n/gi;

$html =~ s/<img(.*?)src="(.*?)"(.*?)>/\[img]$baseurl\/$2\[\/img]/gi;
$html =~ s/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/\[url=$baseurl\/$2]$4\[\/url]/gi;
$html =~ s/\[url=$baseurl\/http:\/\/(.*?)](.*?)\[\/url]/\[url=http:\/\/$1]$2\[\/url]/gi;
$html =~ s/\[img]$baseurl\/http:\/\/(.*?)\[\/img]/\[img]http:\/\/$1\[\/img]/gi;

$html =~ s/<head>(.*?)<\/head>//sgmi;
$html =~ s/<object>(.*?)<\/object>//sgmi;
$html =~ s/<script(.*?)>(.*?)<\/script>//sgmi;
$html =~ s/<style(.*?)>(.*?)<\/style>//sgmi;
$html =~ s/<title>(.*?)<\/title>//sgmi;
$html =~ s/<!--(.*?)-->/\n/sgmi;

$html =~ s/\/\//\//gi;
$html =~ s/http:\//http:\/\//gi;
$html =~ s/https:\//https:\/\//gi;

$html =~ s/<(?:[^>'"]*|(['"]).*?\1)*>//gsi;
$html =~ s/\r\r//gi;
$html =~ s/\[img]\//\[img]/gi;
$html =~ s/\[url=\//\[url=/gi;

(x)HTML을 해석하기 위한 정규 표현 방법에 대한 질문에 대해 몇 가지 제한에 대해 말한 모든 사람의 대답은: 당신은 이 강력한 무기의 힘을 지배하기 위한 충분한 훈련을 받지 않았습니다.여기서 재귀에 대해 말하는 사람은 아무도 없기 때문입니다.

표현에 구애받지 않는 동료가 이 토론에 대해 알려줬습니다.이 토론이 웹상에서 처음 있는 것은 아닙니다.

몇 개의 게시물을 읽은 후, 제가 가장 먼저 한 일은 "?를 찾는 것이었습니다.이 스레드의 R" 문자열.두번째는 "재귀"에 대한 검색이었다.

아니, 이런, 일치하는 게 없어파서가 만들어지는 주요 메커니즘에 대해 아무도 언급하지 않았기 때문에, 나는 아무도 요점을 이해하지 못한다는 것을 곧 알아차렸다.

(x)의 경우HTML 파서는 재귀가 필요합니다.재귀가 없는 정규식 파서는 이 목적을 위해 충분하지 않습니다.간단한 구성입니다.

정규 표현의 블랙 아트는 습득하기 어렵기 때문에 웹 전체를 한 손에 포착하기 위해 개인 솔루션을 테스트하는 동안 간과했던 가능성이 더 있을지도 모릅니다.글쎄요, 확실합니다. :)

매직 패턴은 다음과 같습니다.

$pattern = "/<([\w]+)([^>]*?)(([\s]*\/>)|(>((([^<]*?|<\!\-\-.*?\-\->)|(?R))*)<\/\\1[\s]*>))/s";

한번 해봐.이것은 PHP 문자열로 작성되기 때문에 "s" 수식자는 클래스에 줄바꿈을 포함시킵니다.

1월에 작성한 PHP 매뉴얼에 대한 샘플 노트입니다.참고 자료

(수식어를 잘못 표현 m」의 수식어는 없습니다.^ ★★★★★★★★★★★★★★★★★」$(미국의

이제 이 방법의 제한에 대해 좀 더 많은 정보를 얻은 관점에서 설명할 수 있습니다.

  1. 정규 표현 엔진의 특정 구현에 따르면, 재귀는 해석되는 중첩 패턴의 에 제한이 있을 수 있지만 사용되는 언어에 따라 달라집니다.
  2. (x)HTML이 파손되어도 중대한 에러는 발생하지 않습니다.소독되어 있지 않습니다.

어쨌든 그것은 정규 표현 패턴일 뿐이지만, 많은 강력한 구현의 발전 가능성을 드러낸다.

이 패턴을 작성한 것은 프레임워크에 구축한 템플릿엔진의 재귀적 하강 파서(recursive descent parser)를 강화하기 위해서입니다.실행시간이나 메모리 사용률 모두 퍼포먼스는 매우 뛰어납니다(같은 구문을 사용하는 다른 템플릿엔진과는 전혀 관계가 없습니다).

<\s*(\w+)[^/>]*>

부품 설명:

< 문자 : 작작문 :

\s*: 태그 이름 앞에 공백이 있을 수 있습니다(불가능하지만 가능).

(\w+))를 할 수 태그에는 문자와 숫자(h1)를 포함할 수 있습니다. ②번.\w'일치하지만 않은 것 _'로 지정합니다.([a-zA-Z0-9]+)을 선택합니다.

[^/>]*을 제외한 것:> ★★★★★★★★★★★★★★★★★」/폐점할 >

> : 로징징>

관련 없음

정규 표현은 정규 언어만큼 강력하지 않다며 과소평가하는 동료들에게 다음과 같이 말합니다.

abababa는nnn 정규적이지 않고 문맥도 자유롭지 않아 매칭할 수 있습니다.^(a+)b\1b\1$

백레퍼런스 FTW!

많은 사람들이 이미 지적했듯이 HTML은 해석하는 것을 매우 어렵게 만들 수 있는 일반적인 언어가 아니다.이에 대한 저의 해결책은 깔끔한 프로그램을 사용하여 일반 언어로 변환한 후 XML 파서를 사용하여 결과를 소비하는 것입니다.여기에는 많은 좋은 선택지가 있습니다.내 프로그램은 jtidy 라이브러리와 함께 Java를 사용하여 HTML을 XML로 변환하고 그 결과 Jaxen을 xpath로 변환합니다.

이러한 태그를 단순히 찾으려는 경우(파싱하려는 의도가 없는 경우) 다음과 같은 정규 표현을 사용해 보십시오.

/<[^/]*?>/g

30초 만에 작성해서 http://gskinner.com/RegExr/에서 테스트했습니다.

이 태그는 사용자가 무시한다고 말한 태그의 유형과 일치하지만 무시한다고 말한 유형은 무시합니다.

마지막에 "/"를 붙이지 않고 태그를 매칭하려고 하는 것 같습니다.이것을 시험해 보세요.

<([a-zA-Z][a-zA-Z0-9]*)[^>]*(?<!/)>

사실 프로그래밍을 할 때는 HTML을 다룰 때 정규 표현 대신 전용 파서와 API를 사용하는 것이 좋습니다.특히 정확성이 가장 중요한 경우(예를 들어 처리 시 보안상의 영향이 있을 수 있음).단, XML 형식의 마크업이 정규 표현으로 처리되어서는 안 된다는 독단적인 견해에 의한 것은 아닙니다.텍스트 편집기에서 한 번 편집하거나, 손상된 XML 파일을 수정하거나, XML과 비슷하지만 XML이 아닌 파일 형식을 처리하는 경우 등 정규 표현식이 작업에 유용한 도구인 경우가 있습니다. 몇 가지 주의해야 할 문제가 있지만 극복할 수 없거나 관련성이 있는 것은 아닙니다.

a 음음 음음 음 a a a a a a a a a a a 。<([^>"']|"[^"]*"|'[^']*')*>제가 말씀드린 것과 같은 경우에는 보통 충분합니다.을 고려해 볼 때 이지만, 되지 않은 unencoded an uncoded, uncoded an uncoded, uncoded an uncoded, uncoded an uncoded, uncoded an uncoded, uncoded uncoded, uncoded uncoded an an alling, ember, an uncommanding an an an an an an an an>속성 값의 기호. 예를 들면, 를어들 if, 들어들들, if를 ,table는 ' '태그', '태그', '태그', '태그', '태그', '태그', '태그', '태그', '태그', '태그', '태그', '태그', '태그', '태그</?table\b([^>"']|"[^"]*"|'[^']*')*>.

보다 「고도의」HTML regex가 어떻게 보이는지를 알기 위해서, 실제의 브라우저 동작과 HTML5 의 해석 알고리즘을 에뮬레이트 하는 작업은 다음과 같습니다.

</?([A-Za-z][^\s>/]*)(?:=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)|[^>])*(?:>|$)

다음은 XML 태그의 매우 엄격한 정의와 일치합니다(단, XML 이름에 허용되는 전체 Unicode 문자 집합을 설명하지는 않습니다).

<(?:([_:A-Z][-.:\w]*)(?:\s+[_:A-Z][-.:\w]*\s*=\s*(?:"[^"]*"|'[^']*'))*\s*/?|/([_:A-Z][-.:\w]*)\s*)>

물론, 이것들은 주변 콘텍스트나 몇 개의 엣지 케이스를 설명하지 않지만, 그러한 것조차도, 정말로 필요한 경우(예를 들면, 다른 정규식의 매치를 검색하는 것에 의해서) 처리할 수 있습니다.

결국 작업에 가장 적합한 도구를 사용합니다.그 도구가 정규식인 경우에도 마찬가지입니다.

그 목적을 위해 정규 표현을 사용하는 것은 적절하지 않고 효과적이지는 않지만, 때때로 정규 표현은 단순한 일치 문제에 대한 빠른 해결책을 제공하며, 내가 보기에 사소한 일에 정규 표현을 사용하는 것은 그렇게 끔찍한 일이 아니다.

Steven Levithan이 쓴 가장 안쪽 HTML 요소에 대한 명확한 블로그 게시물이 있습니다.

태그 이름만 원하는 경우 정규 표현을 통해 이 작업을 수행할 수 있습니다.

<([a-zA-Z]+)(?:[^>]*[^/] *)?>

네가 필요한 걸 해야 해하지만 '모리츠'의 해법은 이미 괜찮다고 생각합니다.처음에는 못 봤어요.

모든 다운보터:정규 표현식이 가장 쉽고 빠른 해결책이 될 수 있기 때문에 정규 표현식을 사용하는 것이 이치에 맞는 경우도 있습니다.일반적으로 HTML을 정규 표현으로 해석해서는 안 된다는 것에 동의합니다.

그러나 정규 표현은 HTML의 서브셋을 사용하여 형식을 알고 몇 가지 값만 추출할 경우 매우 강력한 도구가 될 수 있습니다.나는 그것을 수백 번 했고 거의 항상 내가 원하는 것을 성취했다.

작전본부는 그가 태그로 뭘 해야 하는지 말하지 않는 것 같다.예를 들어, 내부 텍스트를 추출하거나 태그만 검사해야 합니까?

나는 정규 표현이 문자 분석기가 아니라고 말하는 캠프에 확고히 찬성한다.HTML 태그를 해석하기 위해코드를 포함한 대량의 텍스트 파싱 코드를 작성했습니다.

사실 정규 표현은 그다지 능숙하지 않지만, 정규 표현은 이러한 종류의 파싱에서는 너무 딱딱하고 유지하기가 어렵다고 생각합니다.

여기에는 다음이 포함됩니다.

<.*?[^/]>

또는 종료 태그가 없는 경우:

<[^/].*?[^/]>

HTML 파서의 불꽃 전쟁은 뭐야?HTML 파서는 검색을 분류하기 전에 문서 전체를 구문 분석(재작성!)해야 합니다.상황에 따라서는 정규 표현이 더 빠르거나 우아할 수 있습니다.내 2센트...

언급URL : https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags

반응형