Código PHP:
<?php
class htmlEditor {
//Recibe un HTML y permite modificar el texto sin preocuparse de alterar los tags
// __construct(html) recibe el html
// getNumberOfPieces() devuelve el numero de trozos de texto desnudos
// getPieceN(n) devuelve la frase que se pide
// setPiceN(numero_de_frase,n) cambia esa frase (elemento del array en la clase)
// getHTML() reconstruye el HTML uniendo las "frases" (texto puro) con los tags y lo devuelve.
private $html;
private $tag; // tags
private $notag; // texto puro
private $notagCant;
function __construct($html){
$this->html = $html;
if ((strlen($this->html)>0) and ($this->html[0]=='<')){
$this->html = ' '.$this->html;
$quitar_espacio=TRUE;
}
$this->no_tags();
$this->notagCant = count ($this->notag);
}
function getNumberOfPieces(){
return $this->notagCant;
}
function getHTML(){
for ($i=0;$i<$this->getNumberOfPieces();$i++){
$a = $this->notag[$i]; // pude hacerle cualquier cosa
$b = $this->tag[$i];
$html = $html.$a.$b; // vuelvo a unir las partes
}
if ($quitar_espacio){
$html =substr ($html,1,strlen($html)-1); // elimino espacio agregado por el tema del offset
}
return $html;
}
function setPieceN($element,$n){
$this->notag[$n]=$element;
}
function getPieceN($n){
return $this->notag[$n];
}
private function no_tags(){
// pre-condicion: la cadena debe empezar con algo distinto a un tag (<)
preg_match_all('@(<[/]?[a-z]{1,}[^>]{0,}[/]?[\w]{0,}?>)@is', $this->html, $matches);
$full_tags = $matches[0];
$full_tags = array_reverse($full_tags); // tengo que sacar del principio
$cant = count($full_tags);
$ini = 0;
for ($i=1;$i<=$cant+1;$i++){
$ti = array_pop ($full_tags);
$fin = strpos($this->html, $ti,$ini);
if ($fin==NULL) $fin=strlen($this->html);
$dif = ($fin-$ini);
$inserto = substr ($this->html,$ini,$dif);
$this->notag[] = $inserto;
//echo "($ini; $fin) ->$inserto <br/>";
$ini = $fin +strlen ($ti);
}
$this->tag = $matches[0];
}
}
?>
- Obtener el numero de "piezas" de texto (queda fragmentado) con getNumberOfPieces
- Obtener uno a uno cada fragmento para realizar las busquedas y reemplazos que corresponda (con str_replace, expresiones regulares, etc.)
- Actualizar cada fragmento cambiado con setPieceN()
- Pedir el HTML embebido en sus tags nuevamente con getHTML()
Espero les sea util
Pronto una clase que hace uso de esta.....