2011-07-27 2 views
2

나는 DOM이 깔끔한 업 - 지저분한-html 태그에 노력하고 있습니다 만, 지금은 더 큰 문제를 실현,Doctype이 HTML에 추가되지 않도록하려면 어떻게해야합니까?

$content = '<p><a href="#">this is a link</a></p>'; 

function tidy_html($content,$allowable_tags = null, $span_regex = null) 
{  
    $dom = new DOMDocument(); 
    $dom->loadHTML($content); 

     // other codes 
    return $dom->saveHTML(); 
} 

echo tidy_html($content); 

출력됩니다 전체 DOM,

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><p><a href="#">this is a link</a></p></body></html> 

하지만 단지 내가 원하지 않는

<p><a href="#">this is a link</a></p> 

반환이 같은 무언가를 원하는

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
    <html><body>...</body></html> 

가능합니까 ??

편집 : 내가 발견

innerHTML 시뮬레이션 &#13;, Â처럼, 내 데이터베이스에 이상한 코드를 생성, ’

<p>Monday July 5th 10am - 3.30pm £20</p>&#13; 
<p>Be one of the first visitors to the ...at this special event.Â</p>&#13; 
<p>All participants will receive a free copy of the ‘Contemporary Art Kit’ produced exclusively for Art on....</p>&#13; 

innerHTML 시뮬레이션,

$innerHHTML = ''; 
$nodeBody = $dom->getElementsByTagName('body')->item(0); 
foreach($nodeBody->childNodes as $child) { 
    $innerHTML .= $nodeBody->ownerDocument->saveXML($child); 
} 

그것이 만든 이유 나는 이런 식으로 뭔가를 할 때 휴식 그래서 saveXML($child)

에 의해 발생이 이상한 코드는

$content = '<p><br/><a href="#">xx</a></p> 
<p><br/><a href="#">xx</a></p>'; 

그것은 이런 식으로 뭔가를 반환합니다

<p><a href="#">xx</a></p>&#13; 
<p><a href="#">xx</a></p> 

하지만 뭔가이 원하는 실제로,

<p><a href="#">xx</a></p> 
<p><a href="#">xx</a></p> 

답변

2

조각 작업중인 경우 요 일반적으로 신체 내용 만 필요합니다.

PHP의 DomDocument는 innerHTML과 같은 기능을 제공하지 않습니다. 당신은 그러나 그것을 시뮬레이션 할 수 있습니다 : 당신은 그냥 조각을 복구 할 경우, 당신은뿐만 아니라 tidy library를 사용할 수있다

$innerHHTML = ''; 
$nodeBody = $dom->getElementsByTagName('body')->item(0); 
foreach($nodeBody->childNodes as $child) { 
    $innerHTML .= $nodeBody->ownerDocument->saveXML($child); 
} 

:

$html = tidy_repair_string($html, array('output-xhtml'=>1,'show-body-only'=>1)); 
+0

감사합니다. 나는 tidy_repair_string을 내 코드에 통합하는 방법을 모르지만 ... innerHTML 시뮬레이션은 완벽하게 작동한다. – laukok

+0

은'innerHTML' 시뮬레이션이 이상한 것을 생성한다는 것을 알았습니다. 위의 편집을 참조하십시오. 감사. – laukok

+0

마지막에 인코딩 문제가있는 것 같습니다. UTF-8로 인코딩 된 문자열을 DomDocument로 펌핑해야합니다. 그리고 전에도 줄 바꿈을 표준화 할 수있었습니다.그러나 깔끔한 라이브러리를 읽어야합니다. 수년간의 경험과 인코딩 및 줄 바꿈을 처리해야합니다. – hakre

0

Hakre 이미 HTML 단정 한,에 show-body-only 옵션을 언급하는 아마 당신이 원하는 것입니다.

ps. Here's 거의 모든 용도로 MediaWiki에서 사용되는 Tidy 설정 파일.

관련 문제