Bu da bunun için bir çözüm arıyor çünkü). Kullanırken içeriği tek bir satır ile değiştirmek için kolay bir yöntem yaptım. Yöntemi daha iyi anlamak için, aynı zamanda adlandırılmış işlevler ekliyorum.
Bu, şimdi benim kütüphanemizin bir parçası, bu yüzden buradaki tüm işlev isimlerinin nedeni budur, tüm işlevler 'su' öneki ile başlar.
Kullanımı çok kolay ve çok güçlü (ve oldukça az kod).
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})));
}
Bazı bağlam fonksiyonları:
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); }
Nasıl kullanılır: Aşağıdaki örneklerde
, ben varsayalım İşte
kodudur zaten bir variab içine yüklenen içerik var le, $sMyHtml
'u aradı ve $sMyNewContent
değişkeni bazı yeni html içeriyor. $sMyHtml
değişkeni, 'example_id
' kimliğine sahip olan/içeren bir öğe içerir. // 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, katkılarımın nereye gittiğine karar vermemeli miyim? Ve ne zamandan beri dünya için konuştunuz? Katkılarımın bir kısmı StackOverflow'tan silindikten ve gizlendikten sonra katkılarımı kendi blog'uma taşımaya karar verdim. Bu şekilde tutmak istiyorum, lütfen değişikliği geri alın. – Keyvan
Potansiyel bir çözümün bağlantısı her zaman bekler, ancak lütfen bağlantı etrafında bir bağlam ekleyin, böylece diğer kullanıcılarınızın ne olduğu ve neden orada olduğu hakkında bir fikirleri olur. Hedef siteye ulaşılamaması veya sürekli olarak çevrimdışı olması durumunda, her zaman önemli bir bağlantının en alakalı bölümünü belirtin. Kaynak: [* Nasıl cevap verilir *] (http://stackoverflow.com/questions/how-to-answer) – Greg
@Greg, Kılavuzların farkındayım. Buradaki cevabı orijinal olarak yayınladım ve diğer sitemlerin bu sitede nasıl ele alındığına bağlı olarak siteme taşıdım - yukarıda belirttiğim gibi silinmiş ve benden gizlenmişler. Neden bir bağlantıya bu kadar çok itiraz ediyorsun? Bu sitenin içerik oluşturucularından birinden düşünce için bazı yiyecekler http://www.codinghorror.com/blog/2009/08/are-you-a-digital-sharecropper.html "Katkılarınız iptal edilebilir, silinebilir veya kalıcı olarak kullanılabilir mi?" rızanız olmadan çevrimdışı aldınız mı? " Stackoverflow'ta: evet. Kendi sitemde: hayır. – Keyvan