2010-03-26 5 views
2

예를 들어, Perl 정규 표현식으로 HTML 페이지의 내용을 스캔 할 때 도메인 확장자가 아닌 모든 파일 확장명과 일치 시키려고합니다. 이렇게하려면 모든 파일 확장명이 큰 따옴표 안에 있어야한다는 가정을합니다.Perl을 사용하여 HTML 텍스트의 상대 링크에서 파일 확장명을 가져 오는 방법은 무엇입니까?

나는 다음과 같은 것을 생각해 냈지만 작동 중이지만 도메인에서 TLD를 제외하는 방법을 찾지 못했습니다. 이

m/"[^<>]+\.([0-9A-Za-z]*)"/g 

이 텍스트로 구분됩니다 따옴표 사이에 하나 개 이상의 기간이있을 경우 경기를 부정 할 수 있는가 등, "인터넷", "COM"를 반환합니다? (예 : foo.bar.com과 일치하지만 ./ 또는 ../이 아니어야 함)

편집 괄호 안에 값을 반환하려면 $1을 사용하고 있습니다.

+4

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454 – msw

+0

고마워, 잠시 동안 검색했지만 그 질문의 제목에 키워드가 충분하지 않았던 것 같습니다. – Structure

+0

도 다음 중 하나를 수행 할 수 없습니다. http://www.google.com/search?hl=ko&q=%22the+%3Ccenter%3E+cannot+hold%22+site:stackoverflow.com – msw

답변

6
#!/usr/bin/perl 

use strict; use warnings; 
use File::Basename; 
use HTML::TokeParser::Simple; 
use URI; 

my $parser = HTML::TokeParser::Simple->new(\*DATA); 

while (my $tag = $parser->get_tag('a')) { 
    my $uri = URI->new($tag->get_attr('href')); 
    my $ext = (fileparse $uri->path, qr/\.\w+\z/)[2]; 
    print "$ext\n"; 
} 

__DATA__ 
<p><a href="../test.png">link</a> <a 
href="http://www.example.com/test.jpg">link on example.com</a> 
</p> 
+0

감사합니다! – Structure

2

우선, 원하는 HTML 파서로 이름을 추출하십시오. 이 같은 생산 것처럼 그런 다음, 이름이 포함 된 배열과 같은이 있어야합니다

my @names = ("http://foo.bar.net/quux", 
      "boink.bak", 
      "mms://three.two.one" 
      "hello.jpeg"); 

파일 확장자에서 도메인 이름을 구별 할 수있는 유일한 방법은 "파일 이름"에 그 것 같다 적어도 하나가 :// 부분과 확장자 사이를 더 자세히 슬래시하십시오. 또한 파일 확장명은 문자열의 마지막 항목 일 수 있습니다.

그래서, 일반 식 (안된)이 같은 것입니다 :

^(?:(?:\w+://)?(?:\w+\.)+\w+/)?.*\.(\w+)$
+0

파서에 대해 자세히 살펴본 후이를 시도해보십시오. . – Structure

+2

직접이 내용을 파싱 할 필요가 없습니다. HTML :: SimpleLinkExtor와 같은 몇 가지 기능이 있습니다. –

-1
#!/usr/bin/perl -w 

use strict; 

while (<>) { 
    if (m/(?<=(?:ref=|src=|rel=))"([^<>"]+?\.([0-9A-Za-z]+?))"/g) { 
     if ($1 !~ /:\/\//) { 
      print $2 . "\n"; 
     } 
    } 
} 

'링크'속성 중 하나 뒤에 쌍 따옴표 사이에있는 물건을 얻기 위해 긍정적 인 lookbehind를 사용 (SCR = rel =, href =). URL을 인식하기 위해 ": //"을보고 절대 경로가있는 파일을 허용하도록 수정되었습니다.

@Structure : 프로토콜 부분을 떠나는 사람을 막는 적절한 방법은 합법적 인 경로 이름 인 http://www.noo.com/afile.cfg -> www.noo.com/afile.cfg입니다. 실제로 링크되어 있는지 확인하기 위해 링크를 모두 wget (또는 무언가)해야합니다. 그리고 그것은 완전히 다른 질문입니다 ...

예, 나는 적절한 파서를 사용한다 알고 있지만, 바로 지금 같은 느낌이 있지 않다 : P

+0

문자열을 깔끔하게 추출하지 않고 가능한 최상위 도메인의 전체 열거 형을 사용하고 이러한 열거 형에 가깝게 제공하지 않으며 심지어 열거 형을 제공하더라도 확장이 동일 할 때 오류가 발생합니다. 최상위 도메인 – Svante

+0

Svante가 지적했듯이 이것이 실패 할 수도 있고 모든 TLD를 나열하여 일치하지 않을 수도 있습니다. 이 점을 감안할 때 파서를 사용하는 것이 장기적으로 더 좋은 해결책이라고 생각합니다. – Structure

+0

Svante의 의견에 맞도록 수정되었습니다. 나는 또한 URL의 ": //"부분을 확인하기 위해 Svante의 아이디어를 확인하여 필터링했다.내가 아는 한, 모든 사람들이 "PAREER를 사용하라"는 것이 증명되었습니다. 만약 당신이 정말 오싹 소설을 쓰고 싶지 않다면 : – Powertieke

관련 문제