2010-02-28 9 views
8

제 코드에서는 openoffice를 사용하여 일부 스타일 xls 문서를 html로 변환합니다. 그런 다음 xml_parser_create을 사용하여 테이블을 구문 분석합니다. openoffice가 닫지 않은 <BR><HR> 태그를 가진 oldschool html을 생성하고, doctypes를 생성하지 않으며 속성을 인용하지 않습니다. <TABLE WIDTH=4>입니다.PHP에서 잘못 형식화 된 HTML 구문 분석

필자가 알고있는 php 파서는 이것을 좋아하지 않으며 xml 형식 오류가 발생합니다. 내 현재 솔루션을 내가 그것을 구문 분석하기 전에 파일을 통해 일부 regexes 실행하는 것입니다 있지만이 좋은 또는 빠른 아닙니다.

이러한 종류의 실수에 신경 쓰지 않는 (잘하면 포함되어있는) PHP 파서를 알고 있습니까? 또는 '깨진'html을 수정하는 빠른 방법일까요? 깨진 HTML 수리를 들어, Tidy을 사용할 수

답변

8

해결책 http://www.ibm.com/developerworks/library/x-pullparsingphp.html이 깨진 HTML은 HTMLPurifier(인용)를 사용하는 수를 "해결"을 참조하십시오 :

HTML 정수기는 PHP로 작성된 표준을 준수하는 HTML 필터 라이브러리입니다.
HTML 정수기는 단지 그것을 또한 문서가


표준을 준수 있는지 확인합니다, 철저하게 감사, 보안 아직 허용 허용 된 사이트 목록과 에게 (더 나은 XSS이라고도 함) 모든 악성 코드를 제거하지 않습니다 또 다른 아이디어는DOMDocument::loadHTML(인용)와 HTML을로드 시도 할 수 있습니다 :

이 함수는 문자열 소스에 포함 된 의 HTML을 구문 분석합니다. 로드 XML과 달리 HTML은 형식이어야합니다.로드하려면 형식이어야합니다.

그리고 파일에서 HTML을로드하려는 경우 DOMDocument::loadHTMLFile을 참조하십시오.

+0

+1 htmlpurifier 소개. http://simplehtmldom.sourceforge.net/도 있습니다. – Alexar

+0

청정기는 좋지만 문제에 대해 다소 과장된 느낌입니다. DOMParser도 마찬가지입니다. 그것은 정확하지 않은가, 그것은 간단한 색소폰 파서보다 많은 시간과 숫양을 필요로 하는가? –

+0

아마 더 많은 RAM과 시간이 필요할 것입니다. 데이터를 읽는 것만으로 수리하지는 않는 단순한 SAX 구문 분석 이상의 기능을 수행합니다. ;; SAX 파서는 유효한 XML 만 읽을 수 있다고 말하고 싶지만 - HTMLPurifier와 DOMDocument :: loadHTML은 모두 "깨진"HTML을 읽을 수 있습니다. –

4

SimpleHTML

이있다.

대신 XML Reader 네이티브를 사용할 수 있습니다. 문서 스트림에서 앞으로 나아가고 각 노드에서 멈추는 커서 역할을하기 때문에 잘못된 XML 문서가 손상되지 않습니다.

+1

+1 깔끔함. SimpleHTML보다 더 강력합니다. 2 가지 작업을위한 2 개의 별도 도구. – HappyTimeGopher

1

PHP 4 XML API를 계속 사용하는 특별한 이유가 있습니까?

PHP 5의 XML API를 사용할 수있는 경우 두 가지 가능성이 있습니다.

먼저 내장 된 HTML 구문 분석기를 사용해보십시오. 그것은별로 좋지 않습니다 (HTML 형식이 좋지 않은 경향이 있습니다). 그러나 트릭을 수행 할 수도 있습니다. DomDocument :: LoadHTML을 살펴보십시오.

두 번째 옵션 - 당신이 HTML5 파서 사양에 따라 HTML 파서를 시도 할 수는 :

http://code.google.com/p/html5lib/

이것은 PHP 내장 HTML 파서보다 더 나은 일을하는 경향이있다. HTML을 DomDocument 객체에로드합니다.

+0

문서가 상당히 크기 때문에 차라리 돔 파서를 사용하지 않을 것입니다. (그리고 나는 이미 색소폰을위한 많은 코드를 썼다.) –

0

해결책은 DOMDocument를 사용하는 것입니다.

예 :

$str = " 
<html> 
<head> 
    <title>test</title> 
</head> 
<body> 
    </div>error. 
    <p>another error</i> 
</body> 
</html> 
"; 

$doc = new DOMDocument(); 
@$doc->loadHTML($str); 
echo $doc->saveHTML(); 

장점 : 기본적으로 PHP 단정에 반대 PHP에 포함되어 있습니다.