Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Evandro Oliveira

[Resolvido] Configurar DOMDocument

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hummm,

 

Não consegui simular, veja só:

<?php
$imp = new DOMImplementation();
$dtd = $imp->createDocumentType( 'html' , '-//W3C//DTD XHTML 1.0 Strict//EN' , 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' );
$dom = $imp->createDocument( 'http://www.w3.org/1999/xhtml' , 'html' , $dtd );
$dom->encoding = 'UTF-8';
$dom->formatOutput = true;

$html = $dom->getElementsByTagName( 'html' )->item( 0 );

$html->appendChild( $head = $dom->createElement( 'head' ) );
$head->appendChild( $dom->createElement( 'title' , 'Um teste' ) );
$html->appendChild( $body = $dom->createElement( 'body' ) );

$body->appendChild( $dom->createElement( 'p' , 'Copyright© 2010, ...' ) );

echo $dom->saveXML();

 

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">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Um teste</title>
</head>
<body>
<p>Copyright© 2010, ...</p>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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','&copy; 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();

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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();

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.