2013-12-13 3 views
0

태그 내용을 제거해야하는 HTML 코드가 있습니다. 그들은 약 30 개입니다. 그것은문자열 첫 번째 일치 발생

<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN></A> 
<b>Hello </b> 
<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN> 
</A><b>World</b> 
<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN></A> 

원하는 출력과 같은 HTML 코드 내 여러 곳에서 발견된다 : 안녕하세요

을 내가 $_=~s/A(.+)?\/A//gs;로 태그 콘텐츠를 제거 할 때. 또한 마지막 태그 안의 유용한 정보를 사용합니다. g를 제거해도 동일한 효과가 있습니다. 처음과 마지막으로 서로 일치하지 않고 태그 내용 만 제거하고 유용한 정보를 제거하는 방법.

+0

당신이 몇 가지 예를 입력하고 필요한 출력을 가지고 있습니까 :로

당신이 트리 구조로 HTML을로드하면

의 XPath는 간단 수 있습니다 필요? – chooban

+0

샘플 코드를 게시했습니다. 나는 오직 안녕과 세상이 필요합니다. – xtreak

+0

몇 가지 정보는 일반적인 철저한 답변을 제공하는 데 필요합니다. 1)이 샘플은 귀하의 샘플과 같은 몇 가지 사례가있는 더 큰 html 코드의 부분적인 부분이라고 가정합니다. 2) 어떻게 구분 기호로 취할을 블록의 첫 번째 . 3) unwanted info is the one between first peer 에 해당하는 것으로 정의 할 수 있습니까? 4) 블록이 항상 여러 줄에 있거나 1 줄에있을 수 있다고 가정 할 수 있습니까? (이 경우 수정 필요) – NeronLeVelu

답변

1

문제는 정규식이 가장 부합하는 부분 문자열 (첫 번째 A부터 마지막 ​​/ A까지)과 일치한다는 것입니다. 그런데

$_=~s/A(.+?)?\/A//gs; 

또는

$_=~s/A(.*?)\/A//gs; 

, 당신의 정규식에서 <> 문자는 다음과 같습니다 + 연산자의 비 욕심 버전을 사용해보십시오? A이 아닌 <A>을 찾고 싶지 않으십니까? How can I write a regex which matches non greedy?

설명 : 그것은 정규 표현식으로 HTML을 구문 분석하는 것은 좋은 생각이 아니다, 너무 많은 잘못 될 수있는 (예를 들어, 당신이 위의 방법으로

당신은 아마 여기를 참조하십시오

$_=~s/\<A\>.*?\<\/A\>//gs; 

을 의미 공백이있는 태그를 찾지 못함). 운동이 임시 문제에 대한 빠르고 즉각적인 해결책이 아니라면 HTML 파서를 사용하십시오!

+0

어떻게 처음 부분 문자열 자체에서 그것을 멈추게할까요? @ JohnB – xtreak

+0

아직도 링크 안에 내용이 있습니다. 감사합니다. HTML 구문 분석기를 사용해 보겠습니다. 하지만 그 안에 내용을 넣고 싶지 않아. . 그렇다면 HTML 파서가 특정 태그 안의 내용을 무시할 수 있습니까? @ 존 B – xtreak

2

정규식으로이 작업을 수행 할 수는 있지만 가장 좋은 방법은 아닙니다. TreeBuilder 및 일부 XPath과 같은 것은 훨씬 더 유지 보수가 쉬운 솔루션을 제공합니다.

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

my @nodes = $tree->find_nodes('//b'); 
관련 문제