2011-01-10 2 views
1

<form> 사이트에서 가져오고 싶습니다. 이 상황에서 양식 부분 사이에는 여전히 다른 HTML 코드가 있습니다. 그들을 제거하는 방법? 내가 PHP를 사용하는 방법을 정기적으로 그냥 부분에서 사이트를 의미합니까?PHP 정규식 문제

$str = file_get_contents('http://bingphp.codeplex.com'); 
preg_match_all('~<form.+</form>~iUs', $str, $match); 
var_dump($match); 
+0

"제거 하시겠습니까?" 당신은'

'을 원했고 그 안에있는 모든 요소들을 가지고 있습니다. 예상되는 결과는 무엇입니까? – Kobi

답변

2

HTML 콘텐츠 추출시 정규식을 사용하면 안됩니다. DOM parser을 사용하십시오.

예.

$doc = new DOMDocument(); 
$doc->loadHTMLFile("http://bingphp.codeplex.com"); 

$forms = $doc->getElementsByTagName('form'); 

업데이트 : 당신은 양식 (당신이 의미 있는지 확실하지 않습니다) 제거하려면 :

for($i = $forms.length;$i--;) { 
    $node = $forms->item($i); 
    $node->parentNode->removeChild($node); 
} 

업데이트 2 :

나는 단지 그들이 있는 것으로 나타났습니다 하나의 전체 본문 내용을 감싸는 양식. 이렇게하면 실제로 전체 페이지를 볼 수 있습니다.

0

내가 생각할 수있는 가장 좋은 방법은 PHP에서 간단한 HTML DOM 라이브러리를 사용하여 DOM 쿼리를 사용하여 HTML 페이지에서 양식을 가져 오는 것입니다.

simplexml 또는 domdocument와 같은 내장 xml 파서를 사용하는 것보다 조금 더 편리합니다.

여기서 the library을 찾을 수 있습니다.

1

정규 표현식 문제는 탐욕심에 있습니다. 그러한 경우에는 .+?이 좋습니다.

그러나 @ Felix가 말한 것은 무엇입니까? HTML 추출에 대해 정규 표현식을 사용할 수 있지만 종종 특정 내용을 찾아 내서 오히려 구문 분석해야합니다. 당신이 사용하는 경우 또한 훨씬 간단 QueryPath :

일반적으로
$str = file_get_contents('http://bingphp.codeplex.com'); 
print qp($str)->find("form")->html(); 
+1

'. +?'이 경우 실패합니다 - 그들은 JavaScript 문자열에''태그 *를 중첩했습니다! 오, 안돼 - 왜!? – Kobi

+0

@Kobi. 어떻게 감히! 흠, 나는이 브라우저가 실제로 작동한다는 것을 몰랐습니다. - 그리고 QueryPath가 PHP를위한 최선의 선택인지는 잘 모르겠다. 왜냐하면 PHP가 굳건하지 않을 수도있는 DomDocument를 사용하기 때문이다. – mario

+0

''문자열은 보통 문제가되며 때로는'' ''으로 쓰여집니다. 왝. – Kobi

0

당신이 HTML을 구문 분석 DOM을 사용해야하지만, 코드의 일부에 의해 장소에서 수정되는으로이 경우에는 웹 사이트가있는 표준 HTML에서 아주 멀리있다 자바 스크립트. 따라서 DOM 객체에로드 할 수 없습니다. 이는 의도적 일 수 있으며 코드를 난독 화하는 한 가지 방법 일 수 있습니다.

어쨌든 당신의 RE (욕심이 많지 않은 일치를 사용하면 도움이되지만)가 아니라 사이트 자체의 디자인으로 인해 원하는 것을 파싱 할 수 없습니다.