So che questo è un vecchio filo (ma rispondo su questo perché anche cercando una soluzione a questo). Ho fatto un metodo semplice per sostituire il contenuto con una sola riga quando lo si utilizza. Per comprendere meglio il metodo, aggiungo anche alcune funzioni con il nome di contesto.
Questa è ora una parte della mia libreria, quindi questo è il motivo di tutti i nomi di funzioni qui, tutte le funzioni iniziano con il prefisso 'su'.
È molto facile da usare e molto potente (e molto meno codice).
Ecco il codice:
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})));
}
Alcune funzioni di contesto:
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); }
Come si usa:
Negli esempi che seguono, suppongo che c'è già contenuto caricato in una variabile le ha chiamato $sMyHtml
e la variabile $sMyNewContent
contiene qualche nuovo html. La variabile $sMyHtml
contiene un elemento chiamato/con l'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, non dovrei decidere dove vanno i miei contributi? E da quando parlavi per il mondo? Ho deciso di trasferire i miei contributi sul mio blog dopo che alcuni dei miei contributi sono stati cancellati da StackOverflow e nascosti da me. Mi piacerebbe mantenerlo in questo modo, quindi ti preghiamo di annullare la modifica. – Keyvan
Un collegamento a una potenziale soluzione è sempre il benvenuto, ma per favore aggiungi un contesto intorno al link in modo che i tuoi colleghi possano avere un'idea di cosa sia e perché è lì. Citare sempre la parte più rilevante di un link importante, nel caso in cui il sito target non sia raggiungibile o sia permanentemente offline. Fonte: [* Come rispondere *] (http://stackoverflow.com/questions/how-to-answer) – Greg
@Greg, sono a conoscenza delle linee guida. Ho postato la risposta qui in origine e l'ho spostata sul mio sito a causa del modo in cui i miei altri contributi sono stati gestiti su questo sito - come ho detto sopra, sono stati cancellati e nascosti da me. Perché ti opponi così tanto a un collegamento è oltre me. Alcuni spunti di riflessione da uno dei creatori di questo sito http://www.codinghorror.com/blog/2009/08/are-you-a-digital-sharecropper.html "I tuoi contributi possono essere revocati, cancellati o permanentemente portato offline senza il tuo consenso? " Su StackOverflow: sì. Sul mio sito: no. – Keyvan