Sé que esto es un hilo de edad (pero la respuesta de esto porque también busca una solución para esto). He creado un método sencillo para reemplazar el contenido con una sola línea cuando lo utilizo. Para comprender mejor el método, también agrego algunas funciones con nombre de contexto.
Esto es ahora parte de mi biblioteca, así que esa es la razón de todos los nombres de funciones, todas las funciones comienzan con el prefijo 'su'.
Es muy fácil de usar y muy potente (y bastante menos código).
Aquí está el código:
function suSetHtmlElementById(&$oDoc, &$s, $sId, $sHtml, $bAppend = false, $bInsert = false, $bAddToOuter = false)
{
if(suIsValidString($s) && suIsValidString($sId))
{
$bCreate = true;
if(is_object($oDoc))
{
if(!($oDoc instanceof DOMDocument))
{ return false; }
$bCreate = false;
}
if($bCreate)
{ $oDoc = new DOMDocument(); }
libxml_use_internal_errors(true);
$oDoc->loadHTML($s);
libxml_use_internal_errors(false);
$oNode = $oDoc->getElementById($sId);
if(is_object($oNode))
{
$bReplaceOuter = (!$bAppend && !$bInsert);
$sId = uniqid('SHEBI-');
$aId = array("<!-- $sId -->", "<!--$sId-->");
if($bReplaceOuter)
{
if(suIsValidString($sHtml))
{
$oNode->parentNode->replaceChild($oDoc->createComment($sId), $oNode);
$s = $oDoc->saveHtml();
$s = str_replace($aId, $sHtml, $oDoc->saveHtml());
}
else { $oNode->parentNode->removeChild($oNode);
$s = $oDoc->saveHtml();
}
return true;
}
$bReplaceInner = ($bAppend && $bInsert);
$sThis = null;
if(!$bReplaceInner)
{
$sThis = $oDoc->saveHTML($oNode);
$sThis = ($bInsert?$sHtml:'').($bAddToOuter?$sThis:(substr($sThis,strpos($sThis,'>')+1,-(strlen($oNode->nodeName)+3)))).($bAppend?$sHtml:'');
}
if(!$bReplaceInner && $bAddToOuter)
{
$oNode->parentNode->replaceChild($oDoc->createComment($sId), $oNode);
$sId = &$aId;
}
else { $oNode->nodeValue = $sId; }
$s = str_replace($sId, $bReplaceInner?$sHtml:$sThis, $oDoc->saveHtml());
return true;
}
}
return false;
}
// A function of my library used in the function above:
function suIsValidString(&$s, &$iLen = null, $minLen = null, $maxLen = null)
{
if(!is_string($s) || !isset($s{0}))
{ return false; }
if($iLen !== null)
{ $iLen = strlen($s); }
return (($minLen===null?true:($minLen > 0 && isset($s{$minLen-1}))) &&
$maxLen===null?true:($maxLen >= $minLen && !isset($s{$maxLen})));
}
Algunas funciones de contexto:
function suAppendHtmlById(&$s, $sId, $sHtml, &$oDoc = null)
{ return suSetHtmlElementById($oDoc, $s, $sId, $sHtml, true, false); }
function suInsertHtmlById(&$s, $sId, $sHtml, &$oDoc = null)
{ return suSetHtmlElementById($oDoc, $s, $sId, $sHtml, false, true); }
function suAddHtmlBeforeById(&$s, $sId, $sHtml, &$oDoc = null)
{ return suSetHtmlElementById($oDoc, $s, $sId, $sHtml, false, true, true); }
function suAddHtmlAfterById(&$s, $sId, $sHtml, &$oDoc = null)
{ return suSetHtmlElementById($oDoc, $s, $sId, $sHtml, true, false, true); }
function suSetHtmlById(&$s, $sId, $sHtml, &$oDoc = null)
{ return suSetHtmlElementById($oDoc, $s, $sId, $sHtml, true, true); }
function suReplaceHtmlElementById(&$s, $sId, $sHtml, &$oDoc = null)
{ return suSetHtmlElementById($oDoc, $s, $sId, $sHtml, false, false); }
function suRemoveHtmlElementById(&$s, $sId, &$oDoc = null)
{ return suSetHtmlElementById($oDoc, $s, $sId, null, false, false); }
Cómo se usa:
En los siguientes ejemplos, supongo que ya hay contenido cargado en una variab Llamó $sMyHtml
y la variable $sMyNewContent
contiene algunos html nuevos. La variable $sMyHtml
contiene un elemento llamado/con el id 'example_id
'.
// Example 1: Append new content to the innerHTML of an element (bottom of element):
if(suAppendHtmlById($sMyHtml, 'example_id', $sMyNewContent))
{ echo $sMyHtml; }
else { echo 'Element not found?'; }
// Example 2: Insert new content to the innerHTML of an element (top of element):
suInsertHtmlById($sMyHtml, 'example_id', $sMyNewContent);
// Example 3: Add new content ABOVE element:
suAddHtmlBeforeById($sMyHtml, 'example_id', $sMyNewContent);
// Example 3: Add new content BELOW/NEXT TO element:
suAddHtmlAfterById($sMyHtml, 'example_id', $sMyNewContent);
// Example 4: SET new innerHTML content of element:
suSetHtmlById($sMyHtml, 'example_id', $sMyNewContent);
// Example 5: Replace entire element with new content:
suReplaceHtmlElementById($sMyHtml, 'example_id', $sMyNewContent);
// Example 6: Remove entire element:
suSetHtmlElementById($sMyHtml, 'example_id');
@Greg, ¿no debería decidir dónde van mis contribuciones? ¿Y desde cuándo hablas por el mundo? Decidí trasladar mis contribuciones a mi propio blog después de que algunas de mis contribuciones se borraron de StackOverflow y se me ocultaron. Me gustaría mantenerlo así, por favor revierte el cambio. – Keyvan
Un enlace a una solución potencial siempre es bienvenido, pero agregue contexto alrededor del enlace para que los demás usuarios tengan una idea de qué es y por qué está allí. Siempre cite la parte más relevante de un enlace importante, en caso de que el sitio objetivo no esté disponible o esté permanentemente fuera de línea. Fuente: [* Cómo responder *] (http://stackoverflow.com/questions/how-to-answer) – Greg
@Greg, conozco las pautas. Publiqué la respuesta aquí originalmente y la moví a mi propio sitio debido a la forma en que se manejaron mis otras contribuciones en este sitio, como mencioné anteriormente, se eliminaron y ocultaron. Por qué objeta tanto a un enlace me supera. Algo de reflexión para uno de los creadores de este sitio http://www.codinghorror.com/blog/2009/08/are-you-a-digital-sharecropper.html "¿Pueden sus contribuciones revocarse, eliminarse o permanecer de forma permanente? desconectado sin tu consentimiento? " En Stackoverflow: sí. En mi propio sitio: no. – Keyvan