2014-02-27 3 views
1

이미지 요소를 묶는 HTML 앵커 요소 세트가 있습니다. 각 세트에 대해 PHP-CLI를 사용하여 URL을 가져 와서 유형에 따라 분류하려고합니다. 앵커 유형은 자식 이미지 요소의 속성에 의해서만 결정될 수 있습니다. 세트 당 각 유형 중 하나만 있으면 쉽게 될 것입니다. 내 문제는 한 유형의 앵커 요소 두 개가 다른 유형 중 하나 이상으로 분리 된 경우입니다. 욕심이없는 괄호로 묶인 하위 패턴은 탐욕스럽게 느껴지고 두 번째 관련 하위 속성을 찾기 위해 확장됩니다. 내 테스트 스크립트에서 나는 다른 유형의 'Userlink'URL을 가져 오려고합니다. 같은 세트에내부 HTML 요소의 속성으로 식별되는 앵커 요소를 구별하기 위해 PHP preg_match_all을 어떻게 사용합니까?

#<a href="(.*?)" custattr="value1"><img alt="Userlink"# 

: 같은 간단한 패턴을 사용하여

<li><a href="http://www.userlink1.com/my/page.html" custattr="value1"><img alt="Userlink" class="common_link_class" height="123" src="pic0.png" width="123" style="width: 123px;"></a></li><li><a href="http://www.socnet1.com/username1" custattr="value1"><img alt="Socnet1" class="common_link_class" height="123" src="pic1.png" width="123" style="width: 123px;"></a></li><li><a href="http://www.socnet2.com/username1" custattr="value1"><img alt="Socnet2" class="common_link_class" height="123" src="pic2.png" width="123" style="width: 123px;"></a></li><li><a href="mailto:[email protected]" custattr="value1"><img alt="Usermail" class="common_link_class" height="123" src="pic3.png" width="123" style="width: 123px;"></a></li><li><a href="http://www.userlink2.com/my/page.html" custattr="value1"><img alt="Userlink" class="common_link_class" height="123" src="pic4.png" width="123" style="width: 123px;"></a></li> 

이 (같은 한 줄에 미안하지만, 실제 HTML입니다)

내 하위 패턴이에서 캡처

첫 번째 "Userlink"URL의 시작부터 마지막 ​​URL의 시작.

여러 가지 미리보기를 시도했지만 여기에 모두 나열해야하는지 잘 모르겠습니다. 지금까지 그들은 위에서 설명한 것과 전혀 일치하지 않거나 동일한 결과를 반환했습니다.

여기 내 테스트 스크립트 (배쉬 쉘에서 실행)입니다 :

#!/usr/bin/php 
<? 
    $lines = 0; 
    $input = ""; 
    $matches = array(); 

    while ($line = fgets(STDIN)){ 
     $input .= $line; 
     $lines++; 
    } 
    fwrite(STDERR, "Processing $lines\n"); 

    $pcre = '#<a href="(.*?)" custattr="value1"><img alt="Userlink"#'; 

    if (preg_match_all($pcre,$input,$matches)){ 
     fwrite(STDERR, "\$matches has " . count($matches) . " elements\n"); 
     foreach ($matches[1] as $match){ 
      fwrite(STDOUT, $match . "\n"); 
     } 
    } 
?> 

PHP의으로, preg_match_all에 대한 어떤 PCRE 패턴() 위의 예에서 두 개의 "Userlink"URL을 반환?

+2

[** HTML을 regex **로 구문 분석하지 마십시오.] (http://stackoverflow.com/a/1732454/2057919). 파서를 사용하십시오. –

+0

ungreedy'. *? '대신 greedy 문자 클래스'[^ "] *'를 사용하십시오. –

+0

이 * ^?! # 링크가있는 Ed Cottrell은 href 내용 만 찾고 싶다면 DOM 좋은 옵션이 될 수 있습니다. –

답변

0

나는 당신의 변수 이름을 변경하는 자유를 촬영했다.

0

이 정규식 작동합니다 - 당신은 그것을 here를 작동하는 방법을 볼 수 있습니다

<a href="([^"]*?)"[^>]*\><img alt="Userlink" 

. 으로, preg_match_all 기능은 일치의 수를 돌려

$pattern = '~<a href="([^"]++)" custattr="value1"><img alt="Userlink"~'; 

if ($nb = preg_match_all($pattern, $input, $matches)) { 
    fwrite(STDERR, "\$matches has " . $nb . " elements\n"); 
    fwrite(STDOUT, implode("\n", $match) . "\n"); 
} 

참고 : -

테스트는

$pcre = '/<a href="([^"]*?)"[^>]*\><img alt="Userlink"/'; 
if (preg_match_all($pcre,$input,$matches)){ 
    var_dump($matches); 
    //$matches[1] will be the array containing the urls. 
} 
/* 
    OUTPUT- 
    array 
     0 => 
     array 
      0 => string '<a href="http://www.userlink1.com/my/page.html" custattr="value1"><img alt="Userlink"' (length=85) 
      1 => string '<a href="http://www.userlink2.com/my/page.html" custattr="value1"><img alt="Userlink"' (length=85) 
     1 => 
     array 
      0 => string 'http://www.userlink1.com/my/page.html' (length=37) 
      1 => string 'http://www.userlink2.com/my/page.html' (length=37) 
*/