2010-04-16 10 views
0

아래 가상의 HTML 파일에서 이름 결과 만 추출하려고합니다. 어레이 ( 이름 1 이름 2 이름 3 .......... )preg_match에서 이름을 가져 오는 방법

:

<ul class="cat"> 
<li>sport</li> 
<li>movie</li> 
</ul> 
<ul class="person-list"> 
<li>name 1</li> 
<li>name 2</li> 
<li>name 3</li> 
<li>name 4</li> 
<li>name 5</li> 
<li>name 6</li> 
</ul> 

적 결과는 다음과 같은 배열 형식으로 와야

OK 2 개의 정규식으로이 작업을 쉽게 수행 할 수 있습니다. 단 하나의 작업으로도 할 수 있는지 궁금합니다.

답변

0

DOMDocument와 같은 HTML 파서를 사용하면 훨씬 쉽고 훨씬 강력 해집니다. HTML은 regular language이 아니기 때문에 Regexes는 HTML을 구문 분석하기위한 부적절한 도구입니다.

$html = <<<END 
<ul class="cat"> 
<li>sport</li> 
<li>movie</li> 
</ul> 
<ul class="person-list"> 
<li>name 1</li> 
<li>name 2</li> 
<li>name 3</li> 
<li>name 4</li> 
<li>name 5</li> 
<li>name 6</li> 
</ul> 
END; 
$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXpath($dom); 
$items = $xpath->query("//li[starts-with(.,'name ')]/text()"); 
foreach ($items as $item) { 
    echo $item->wholeText . "\n"; 
} 

출력 : 뭔가를 시도

다음
name 1 
name 2 
name 3 
name 4 
name 5 
name 6 
0

$pattern = '/<ul class=\"person\-list\">\s*(<li>(.*?)<\/li>)*\s*<\/ul>/ms'; preg_match_all($pattern, $TXT, $array); echo '<pre>', print_r($array, true), '</pre>';

0

이 할 수있는 샘플 펄 스크립트입니다. HTML 파일의 각 라인 $ 라인으로 읽을 수 있으며, 우리는 현재 행이 우리 무엇에 일치하는 경우

/<li>\s*(name[^>]+)<\/li>/ 

보고 정규식을 사용 - 당신의 HTML을 가정하면 설명이

open FILE, "<", "my.html" or die $!; 
my @arr; 
while (my $line = <FILE>) { 
    if ($line =~ /<li>\s*(name[^>]+)<\/li>/) { 
    push(@arr, $1); 
    } 
} 
print "Array (@arr)\n"; 

my.html에 want (즉, 문자열 태그의 이름 뒤에 li 태그 안에 몇 개의 문자가 포함되어 있음). 동시에 "이름 뒤에 몇 문자"하위 문자열은 역 참조로 캡처됩니다. 일치하는 항목이 있으면 캡처 된 문자열이 배열에 추가됩니다.

관련 문제