Regex를 사용하여 클래스에서 전체 HTML 태그 (및 내용)를 어떻게 제거 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/226562

  •  03-07-2019
  •  | 
  •  

문제

나는 REGEX에별로 좋지 않지만 배우고 있습니다.

클래스 이름으로 HTML 태그를 제거하고 싶습니다. 이것이 내가 지금까지 가지고있는 것입니다.

<div class="footer".*?>(.*?)</div>

첫번째 .*? 다른 속성을 포함 할 수 있고 두 번째는 다른 HTML 물건을 포함 할 수 있기 때문입니다.

내가 뭘 잘못하고 있죠? 나는 성공하지 않고 많은 세트를 시도했습니다.

업데이트

DIV 내부에는 여러 줄이 포함될 수 있으며 Perl Regex와 함께 연주하고 있습니다.

도움이 되었습니까?

해결책

DIV 태그에서 수업 전에 다른 것들을 허용하고 싶을 것입니다.

<div[^>]*class="footer"[^>]*>(.*?)</div>

또한 사례에 민감하지 않습니다. 인용문이나 닫는 태그의 슬래시와 같은 것을 피해야 할 수도 있습니다. 어떤 맥락 에서이 작업을 수행하고 있습니까?

또한 입력에 따라 정규 표현식으로 HTML 파싱은 매우 불쾌 할 수 있습니다. 좋은 점은 아래의 답변에서 가져옵니다.

<div>
    <div class="footer">
        <div>Hi!</div>
    </div>
</div>

그것에 대한 정규식을 만들려고하는 것은 재난을위한 레시피입니다. 가장 좋은 방법은 문서를 DOM에로드하고 이에 대한 조작을 수행하는 것입니다.

xml :: dom에 밀접하게 매핑되어야하는 pseudocode :

document = //load document
divs = document.getElementsByTagName("div");
for(div in divs) {
    if(div.getAttributes["class"] == "footer") {
        parent = div.getParent();
        for(child in div.getChildren()) {
            // filter attribute types?
            parent.insertBefore(div, child);
        }
        parent.removeChild(div);
    }
}


여기에는 Perl 라이브러리가 있습니다. html :: dom, 그리고 또 다른, xml :: dom
.NET에는 DOM 파싱을 처리 할 수있는 내장 라이브러리가 있습니다.

다른 팁

다른 사람들이 말했듯이, HTML은 Regexes 사용을 다루기가 까다로워서 DOM 접근 방식이 더 나을 수 있습니다. 예 :

use HTML::TreeBuilder::XPath;

my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse_file( 'yourdocument.html' );

for my $node ( $tree->findnodes( '//*[@class="footer"]' ) ) {
    $node->replace_with_content;   # delete element, but not the children
}

print $tree->as_HTML;

Perl에서 당신은 필요합니다 /s 수정 자, 그렇지 않으면 도트가 Newline과 일치하지 않습니다.

즉, 적절한 HTML 또는 XML 파서를 사용하여 HTML 파일의 원치 않는 부분을 제거하는 것이 훨씬 적절합니다.

<div[^>]*class="footer"[^>]*>(.*?)</div>

나를 위해 일했지만 특수 캐릭터 전에 백 슬래시를 사용해야했습니다.

<div[^>]*class=\"footer\"[^>]*>(.*?)<\/div>

부분적으로 사용중인 정확한 Regex 엔진 (언어 등)에 의존하지만 한 가지 가능성은 따옴표 및/또는 전진 슬래시를 피해야 할 가능성이 있습니다. 당신은 또한 그것을 둔감하게 만들고 싶을 수도 있습니다.

<div class=\"footer\".*?>(.*?)<\/div>

그렇지 않으면 사용중인 언어/플랫폼 - .NET, Java, Perl ...

이 시도:

<([^\s]+).*?class="footer".*?>([.\n]*?)</([^\s]+)>

가장 큰 문제는 중첩 태그가 될 것입니다. 예를 들어:

<div class="footer"><b></b></div>

주어진 regexp는 </b>, 떠난 </div> 끝에 매달려. 원하는 태그에 중첩 된 요소가 없다고 가정하거나 HTML에서 DOM까지의 소포를 사용하고 전체 하위 트리를 제거해야합니다.

이것은 정규 표현의 욕심 때문에 까다로울 것입니다. 5월 Perl에만 국한되지만 Greediness는 Res의 일반적인 문제라는 것을 알고 있습니다.) 두 번째는 .*? 전에 가능한 한 많이 일치합니다 </div>, 다음이있는 경우 :

<div class="SomethingElse"><div class="footer"> stuff </div></div>

표현식이 일치합니다.

<div class="footer"> stuff </div></div>

당신이 원하는 것이 아닐 것입니다.

왜 안 돼 <div class="footer".*?</div> 나도 Regex Guru는 아니지만 열린 div 태그에 대한 마지막 괄호를 지정할 필요는 없다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top