2012-12-08 4 views
0

<div id="class1">에서 정규식을 찾아 </div> 끝까지 찾아야합니다. 나는 또한 안에 많은 텍스트가 들어있을 수 있습니다. <div>. 아래 코드를 찾으십시오.요소 내부의 요소를 찾으려면 Perl 정규 표현식

This is example <div id="class1">This is <div id="subclass1">This is </div> <div id="subclass2">This is </div> This is </div> This is example 

아래 코드를 시도했습니다. 그러나 그것은 처음까지만 얻습니다. </div><div id="subclass1"> 이 문제를 해결할 수 있습니까? 내가 캡처하려고

코드는 다음과 같습니다

<div id="class1">(?:(?!<\/div>).)*?</div> 
+2

'perldoc을 -q html' – toolic

+3

정규 표현식에와 HTML을 구문 분석하려고하지 마십시오. Regexes는 작업에 달려 있지 않습니다. HTML 파서를 사용하십시오. http://htmlparsing.com/perl.html에는 Perl에 대한 몇 가지 예제가 있습니다. –

+0

필수 링크 : http://stackoverflow.com/questions/1732348 -이 질문에 대한 답변보기 –

답변

4

적절한 HTML 구문 분석기를 사용하십시오.

use strict; 
use warnings; 
use feature qw(say); 

use XML::LibXML qw(); 

my $html = 'This is example <div id="class1">This is <div id="subclass1">This is </div> <div id="subclass2">This is </div> This is </div> This is example'; 

my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_html_string($html); 
my $root = $doc->documentElement(); 

for my $div ($root->findnodes('//div[@id="class1"]')) { 
    say "[", $div->toString(), "]"; 
} 
+0

소스 코드를 제공해 주셔서 감사합니다. 이것이 정규 표현식을 통해 가능할 수 있습니까? – siva2012

+0

확실히, 모든 것을' '= ~/(? {...}) /;로 둘러 쌉니다. – ikegami

0
$ echo 'This is example <div id="class1">This is <div id="subclass1">This is </div> <div id="subclass2">This is </div> This is </div> This is example' | sed -n 's/<div id="class1">\(.*\)<\/div>/\1/p' 
This is example This is <div id="subclass1">This is </div> <div id="subclass2">This is </div> This is This is example 
0

당신은 적절한 HTML/XML 파서를 사용해야합니다. 어떤 이유로 든 regex를 사용하여 작업하려면 중첩 된 regex가 도움이됩니다.

$re = qr{ 
    (
    <div[^>]*> 
    (?:(??{$re}) | [^<>]*)* 
    </div> 
) 
}x; 

print "$1\n" if(/$re/o); 
0

많은 사람들은 정규 표현식이 아닌 HTML을 구문 분석하기 위해 항상 "적절한 HTML 구문 분석기 사용"이라고 말합니다. 어떤 사람들은 깨닫지 못하는 것은 충족해야 할 요구 사항이 있고 그러한 요구 사항은 정규 표현식을 요구할 수 있다는 것입니다.

<div id=".+?">.*</div>이 도움이 될 것입니다.

http://regexr.com?33336

관련 문제