Regex를 사용하여 클래스에서 전체 HTML 태그 (및 내용)를 어떻게 제거 할 수 있습니까?
문제
나는 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 태그에 대한 마지막 괄호를 지정할 필요는 없다고 생각합니다.