Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Precisava desabilitar a quotation do objeto DOMDocument, pois a mesma está quebrando a saída do documento.
Quando defino um valor do tipo por exemplo:
$tag->nodeValue = "©";
Ele me gera como saída:
©
Já tentei a propriedade substituteEntities = false; sem sucesso. Descobri que não é pra isso que ela serve.
Dessa forma aqui gera o erro:
<?php
$imp = new DOMImplementation();
$dtd = $imp->createDocumentType( 'html' , '-//W3C//DTD HTML 4.01//EN' , 'http-~~-//www.w3.org/TR/html4/strict.dtd' );
$html = $imp->createDocument( null , 'html' , $dtd );
$html->encoding = 'UTF-8';
$html->formatOutput = true;
//$html = $dom->getElementsByTagName( 'html' )->item( 0 );
$head = $html->appendChild( $html->createElement( 'head' ) );
$head->appendChild( $html->createElement( 'title' , 'Um teste' ) );
$meta = $head->appendChild( $html->createelement( 'meta' ) );
$meta->setAttribute('name','copyright');
$meta->setAttribute('content','© 2010.');
$body = $html->appendChild( $html->createElement( 'body' ) );
$img = $body->appendChild( $html->createElement( 'p' ) );
$img->setAttribute('src','manutencao.jpg');
$img->setAttribute('alt','Em manutenção');
$img->setAttribute('title','Estamos em manutenção');
echo $html->saveHTML();Tente assim:
<?php
$imp = new DOMImplementation();
$dtd = $imp->createDocumentType( 'html' , '-//W3C//DTD HTML 4.01//EN' , 'http-~~-//www.w3.org/TR/html4/strict.dtd' );
$dom = $imp->createDocument( null , 'html' , $dtd );
$dom->encoding = 'UTF-8';
$dom->formatOutput = true;
$html = $dom->getElementsByTagName( 'html' )->item( 0 );
$head = $html->appendChild( $dom->createElement( 'head' ) );
$head->appendChild( $dom->createElement( 'title' , 'Um teste' ) );
$meta = $head->appendChild( $dom->createelement( 'meta' ) );
$meta->setAttribute('name','copyright');
$meta->appendChild( $content = new DOMAttr( 'content' ) );
$content->appendChild( new DOMEntityReference( 'copy' ) );
$content->appendChild( new DOMText( ' 2010' ) );
$body = $html->appendChild( $dom->createElement( 'body' ) );
$img = $body->appendChild( $dom->createElement( 'p' ) );
$img->setAttribute('src','manutencao.jpg');
$img->setAttribute('alt','Em manutenção');
$img->setAttribute('title','Estamos em manutenção');
echo $dom->saveHTML();
>
$html = $imp->createDocument( null , 'html' , $dtd );
//$html = $dom->getElementsByTagName( 'html' )->item( 0 );
Fez o teste para ver a consequencia dessa modificação ?
:P
Ah, um detalhe básico heheheeh. Não tinha chegado a notar porque faço a saída com Tidy (com os quotes desligados para evitar conflito).
A solução apresentada resolve, parcialmente. O problema é que desse modo eu tenho que fazer uma verificação a cada string que aparecer, buscar por entities e gerar o conteúdo do DOMElement só por causa da entitie.
Isso sem contar que pretendo fazer a entrada de dados utilizando htmlentities() para permitir a reutilização com dados vindos por exemplo de bancos de dados ou de um sistema de comentários.
>
O problema é que desse modo eu tenho que fazer uma verificação a cada string que aparecer
Opz...
De onde estão vindo essas strings ???
Já tentou utilizar o número da entidade em vez do nome dela ? http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://www.w3schools.com/tags/ref_entities.asp
<?php
$imp = new DOMImplementation();
$dtd = $imp->createDocumentType( 'html' , '-//W3C//DTD HTML 4.01//EN' , 'http-~~-//www.w3.org/TR/html4/strict.dtd' );
$dom = $imp->createDocument( null , 'html' , $dtd );
$dom->encoding = 'UTF-8';
$dom->formatOutput = true;
$html = $dom->getElementsByTagName( 'html' )->item( 0 );
$head = $html->appendChild( $dom->createElement( 'head' ) );
$head->appendChild( $dom->createElement( 'title' , 'Um teste' ) );
$copyright = $dom->createDocumentFragment();
$copyright->appendXML( '<meta name="copyright" content="© 2010" />' );
$head->appendChild( $copyright );
$body = $html->appendChild( $dom->createElement( 'body' ) );
$img = $body->appendChild( $dom->createElement( 'p' ) );
$img->setAttribute('src','manutencao.jpg');
$img->setAttribute('alt','Em manutenção');
$img->setAttribute('title','Estamos em manutenção');
echo $dom->saveHTML();De onde estão vindo essas strings ???
Pensando a nível de reutilização elas podem vir de qualquer lugar, não?
Uma postagem via painel de administrador, um relatório do banco de dados, um comentário num post de blog, upload de um arquivo de texto/xml, informações de formulário de cadastro, etc...
Encontrei uma possível solução.
Pesquisando um problema parecido, sugeriram que se trocasse todas as ocorrências indesejadas pelo equivalente via REGEX.
A saída até o momento seria:
$html = preg_replace('/&/', '&', $dom->saveHTML());
Está me servindo bem e sem falhas, em todos os cenários que testei.
Hummm,
Não consegui simular, veja só:
Saída:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">