Escribir libremente en un HTML a través de PHP

Iniciado por Puntoinfinito, 29 Enero 2013, 17:37 PM

0 Miembros y 3 Visitantes están viendo este tema.

Puntoinfinito

Hola,

Hay algúna manera de modificar un archivo de texto cualquiera (html...), pudiendo añadir textos en la linea y columna deseada. Eso sí todo a través de un script PHP.

Saludos!

AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

jdc

Tienes file_get_contents() para obtener cualquier html, quizas podrias editar algo en cierta linea, columna eso si, no se me ocurre para nada.

Puntoinfinito

Mmm es que la idea es que al crear una nueva pagina, esto se añada a un menú que hay en HTML... ;/
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

#!drvy

LoL. Pues haz el menú en PHP y que vaya obteniendo los items de un xml por ejemplo. Hay ciertas Class'es muy buenas para tratar XML en PHP. Así luego haces un foreach y muestras cada item del menú.

Ademas te sera mucho mas fácil editar el XML para agregar nuevas paginas.




Saludos


Puntoinfinito

No, no entendiste bien.

Hay ya una página creada donde hay toda una lista.

Ejemplo
lista.html
<body>
<ul>
<li>Noticia 1</li>
<li>Noticia 2</li>
<li>- Noticia 3</li>
</ul>
</body>


Ahora yo quiero un script php que añada a lista.html un nuevo punto, es decir que escriba <li>Noticia 4</li>. Así entonces se mostrará lo que quiero.

Se entiende más o menos?
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

jdc

Donde tienes "Noticia 1, Noticia 2, Noticia 3 y Noticia 4"?

Puntoinfinito

Como he indicado en lista.html :)

Esa lista se encuentra en un html, lo que quiero hacer con el php es que añada "<li>Noticia X</li>". Y no puede ser con fwrite() ya que esto lo añade al final.
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

#!drvy

El que no me entiende eres tu -.- pero bueno... Supongamos que tenemos un archivo...

Código (html4strict) [Seleccionar]
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>POC</title>
</head>
<body>
  <ul id="mimenu">
     <li>Menu 1</li>
     <li>Menu 2</li>
     <li>Menu 3</li>
  </ul>
</body>
</html>


Podrías utilizar DOM para modificarlo,

Código (php) [Seleccionar]
<?php
$archivo 
'documentoHTML.html';
// Declaramos el DOM object.
$doc = new DOMDocument;
// Cargamos el archivo.
$doc->loadHTMLFile($archivo);
// Al final, queremos que lo ordene un poco.
$doc->formatOutput true;
// Buscamos el elemento con id "mimenu"
$elemento $doc->getElementById('mimenu');
// Creamos un nuevo li con contenido "Menu 5"
$nuevo $doc->createElement('li','Menu 5');
// Agregamos el nuevo li al elemento
$elemento->appendChild($nuevo);
// Guardamos el archivo HTML
$doc->saveHTMLFile($archivo);
?>


Claro que esto agrega automáticamente el html,head y etc etc etc... así que tendrás que buscar una solución para que no interfiera con lo tuyo, en caso de que uses HTML5.

También puedes utilizar regex..

Código (php) [Seleccionar]
<?php
$archivo 
'documentoHTML.html';

function 
anadir_a_ul($nuevo=NULL,$id=NULL,$contenido){
   
// Extraemos el menu.
   
$menu preg_match('/<ul id\=\"'.$id.'\">(.*)<\/ul>/imsu'$contenido,$result);
   if(!
$menu){return false;}
   
// Declaramos el nuevo li.
   
$nuevo "<li>".$nuevo."</li>\n";
   
// Lo añadimos detras del </ul> y quitamos todas las lineas blancas previas.
   
$result str_replace('</ul>',$nuevo.'</ul>',preg_replace('/^[ \t]*[\r\n]+/imu','',$result[0]));
   
// reemplazamos el nuevo con el viejo
   
$final preg_replace('/<ul id\=\"'.$id.'\">(.*)<\/ul>/imsu',$result,$contenido);
   return 
$final;
}

// Obener contenido del archivo.
$contenido file_get_contents($archivo);
// Procesar la funcion.
$contenido_nuevo anadir_a_ul('Menu 5','mimenu',$contenido);
// Abrir archivo reemplazando su contenido.
$handle fopen($archivo,'w+');
// Guardar nuevo contenido.
fwrite($handle,$contenido_nuevo);
fclose($handle);
?>


Lo que retornaría:
Código (html4strict) [Seleccionar]
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>POC</title>
</head>
<body>
  <ul id="mimenu">
     <li>Menu 1</li>
     <li>Menu 2</li>
     <li>Menu 3</li>
  <li>Menu 5</li>
</ul>
</body>
</html>


PD: Lo que has dicho de fwrite no es cierto. Mas que nada porque todo depende de con que propiedades abres el archivo. Si lo abres con a+ por ejemplo, si, escribirás en la ultima linea, pero si lo abres con r+ escribirás al principio.

PD2: Te estas complicando enormemente la vida y no entiendo porque. Imagínate que tienes que editar varios archivos... tendrías que ir modificandolos todos.. ademas ni siquiera sabes el peso que puede llegar a tener ese archivo.. eso es carga adicional INUTIL para PHP y para el servidor. Re-lee lo que te dije anteriormente es mucho mas fácil obtener el menu de otro archivo que tener que editar el html entero cada vez que quieres añadir uno nuevo.

Pero bueno... si estas empeñado en tener lo tuyo... ahí lo tienes.. espero que te sirva.

Saludos

Puntoinfinito

Cita de: drvy | BSM en 30 Enero 2013, 19:23 PM
El que no me entiende eres tu -.- pero bueno... Supongamos que tenemos un archivo...

Sí, ya entendí, pero la forma de XML y demás es la más eficaz?

Cita de: drvy | BSM en 30 Enero 2013, 19:23 PM
Podrías utilizar DOM para modificarlo,

Código (php) [Seleccionar]
<?php
$archivo 
'documentoHTML.html';
// Declaramos el DOM object.
$doc = new DOMDocument;
// Cargamos el archivo.
$doc->loadHTMLFile($archivo);
// Al final, queremos que lo ordene un poco.
$doc->formatOutput true;
// Buscamos el elemento con id "mimenu"
$elemento $doc->getElementById('mimenu');
// Creamos un nuevo li con contenido "Menu 5"
$nuevo $doc->createElement('li','Menu 5');
// Agregamos el nuevo li al elemento
$elemento->appendChild($nuevo);
// Guardamos el archivo HTML
$doc->saveHTMLFile($archivo);
?>


Lo que buscava!! El DOM funciona perfectamente, no sabía su existencia :D Para insertar dentro de ese li, un link? Hay manera?

Gracias!! y saludos;
Puntoinfinito
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

Puntoinfinito

#9
Ah, otra cosa, el DOM reguarda el archivo en una codificación que me deshace todos los accentos y demás. He probado de añadir esto antes de ejecutar el saveHTMLfile;

$doc->encoding = 'UTF-8'; y  $doc->encoding = 'iso-8859-1';

Pero nada... :)

Con que se tendría que hacer?
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.