2008-08-29 4 views
3

웹 페이지를 긁는 것과 관련된 PHP 스크립트를 작성하고 있습니다. 현재 스크립트가 라인으로 페이지 라인을 분석하지만, 여러 줄에 걸쳐있는 태그가 존재하는 경우 모든 줄 바꿈을 제거하여 I 수 가능성이 페이지를 사전 처리, html 태그가 여러 줄로 나뉘어 있는지 확인하는 방법

<img src="example.jpg" 
alt="example"> 

더 악화에 오면

처럼, 나누기, 그런 다음 가장 가까운 >에 다시 삽입합니다. 그러나 이것은 마치 진흙탕처럼 보입니다.

이상적으로는 줄을 확장하는 태그를 감지 할 수 있고 줄에 붙이는 태그 만 감지하여 처리를 계속할 수 있습니다.
그래서 이것을 감지하는 가장 좋은 방법은 무엇입니까?

답변

1

아마 미래의 프로젝트에서 파싱 라이브러리를 사용할 것입니다.하지만 그것은 당면한 질문을 제쳐두고 있습니다. 이것은 현재 나의 해결책입니다. rstrpos은 strpos이지만 역방향입니다.사용 예 : 여기

for($i=0; $i<count($lines); $i++) 
{ 
    $line = handle_mulitline_tags(&$i, $line, $lines); 
} 

그리고 그 구현의 :

function rstrpos($string, $charToFind, $relativePos) 
{ 
    $searchPos = $relativePos; 
    $searchChar = ''; 

    while (($searchChar != $charToFind)&&($searchPos>-1)) 
    { 
     $newPos = $searchPos-1; 
     $searchChar = substr($string,$newPos,strlen($charToFind)); 
     $searchPos = $newPos; 
    } 

    if (!empty($searchChar)) 
    { 
     return $searchPos; 
     return TRUE; 
    } 
    else 
    { 
     return FALSE; 
    } 
} 

function handle_multiline_tags(&$i, $line, $lines) 
{ 
    //if a tag is opened but not closed before a line break, 

    $open = rstrpos($line, '<', strlen($line)); 
    $close = rstrpos($line, '>', strlen($line)); 
    if(($open > $close)&&($open > -1)&&($close > -1)) 
    { 
     $i++; 
     return trim($line).trim(handle_multiline_tags(&$i, $lines[$i], $lines)); 
    } 
    else 
    { 
     return trim($line); 
    } 
} 

이 아마 어떤 방법으로 최적화 할 수 있지만 내 목적을 위해 충분한입니다.

1

음, 이것은 HTML을 분석하지 내가 제일 스크래핑 전략 생각 (결과적으로이 문제를 제거하기 위해) ...

이다 질문에 대답하고 의견을 더하지 않지만, HTML별로 부자연스럽지 만 그 자연 분리 문자로 분석 할 수 있습니다 : <> 쌍.

물론 두 가지 유형이있을 것이다 즉시 폐쇄

  • 태그 요소, 예를 들어, < BR 별도의 닫는 태그가 필요합니다 />
  • 태그 요소, 예를 들어, < P> 텍스트 </P>

당신은 즉시 단락 (P) 태그의 경우이 전략을 사용의 이점을 볼 수 있습니다 : mutiline 대신 닫는 태그가 어디 있는지 추적 할 필요없이 문단 구문 분석하는 것이 더 쉬울 수 있습니다.

7

이것은 내 애완 동물의 모습입니다. 결코을 수동으로 구문 분석하십시오. 안 함 정규식이있는 HTML을 구문 분석합니다. 절대 문자열 비교를 통해 HTML을 구문 분석합니다. 항상은 HTML 구문 분석기를 사용하여 HTML을 구문 분석합니다.

PHP를 다 실행한지 오래되었지만 빠른 검색은 this PHP5 HTML parser입니다.

2

파서를 쓰지 말고 다른 사람의 것을 사용하십시오 : DOMDocument::loadHTML - 그 중 하나 일뿐입니다. 다른 많은 것들이 있다고 생각합니다.

0

줄을 읽은 다음 문자열로 설정 한 다음 태그 열기 및 닫기를위한 문자열을 확인하십시오. 태그가 한 줄 이상 뻗어 있으면 문자열에 다음 줄을 추가하고 부품을 이동하십시오. 여는 중괄호가 처리 된 문자열 앞에옵니다. 그런 다음이 작업을 수행하는 전체 파일을 구문 분석합니다. 그 아름답 지 않지만 작동해야합니다.

0

현재 구문 분석 방법을 고수하고 정규식 인 경우 multi-line flag "m"을 여러 줄에 걸쳐 사용할 수 있습니다.

관련 문제