Tôi biết đây là một chủ đề cũ (nhưng trả lời trên điều này bởi vì cũng tìm kiếm một giải pháp cho điều này). Tôi đã thực hiện một phương pháp dễ dàng để thay thế nội dung chỉ bằng một dòng duy nhất khi sử dụng nó. Để hiểu được phương thức tốt hơn, tôi cũng thêm một số ngữ cảnh có tên hàm.
Đây là một phần của thư viện của tôi, vì vậy đó là lý do của tất cả các tên hàm ở đây, tất cả các hàm bắt đầu bằng tiền tố 'su'.
Rất dễ sử dụng và rất mạnh (và ít mã hơn).
Đây là mã:
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})));
}
Một số chức năng bối cảnh:
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); }
Làm thế nào để sử dụng nó:
Trong ví dụ sau đây, tôi cho rằng đã có nội dung được tải vào một variab le được gọi là $sMyHtml
và biến số $sMyNewContent
chứa một số html mới. Biến số $sMyHtml
chứa phần tử có tên/với 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, tôi có nên quyết định nơi đóng góp của mình không? Và từ khi nào bạn nói cho thế giới? Tôi quyết định di chuyển những đóng góp của mình lên blog của chính mình sau khi một số đóng góp của tôi đã bị xóa khỏi StackOverflow và bị ẩn khỏi tôi. Tôi muốn giữ nó theo cách đó, vì vậy hãy hoàn nguyên thay đổi. – Keyvan
Liên kết tới giải pháp tiềm năng luôn được chào đón, nhưng vui lòng thêm ngữ cảnh xung quanh liên kết để người dùng đồng nghiệp của bạn sẽ biết ý tưởng đó là gì và tại sao lại có nó. Luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang web mục tiêu không thể truy cập được hoặc sẽ vĩnh viễn ngoại tuyến. Nguồn: [* Cách trả lời *] (http://stackoverflow.com/questions/how-to-answer) – Greg
@Greg, tôi biết các nguyên tắc. Tôi đã đăng câu trả lời ở đây ban đầu và chuyển nó đến trang web của riêng tôi do cách đóng góp khác của tôi đã được xử lý trên trang web này - như tôi đã đề cập ở trên, chúng đã bị xóa và ẩn khỏi tôi. Tại sao bạn phản đối quá nhiều đến một liên kết nằm ngoài tôi. Một số thực phẩm được tư tưởng từ một trong những người sáng tạo của trang web này http://www.codinghorror.com/blog/2009/08/are-you-a-digital-sharecropper.html "Đóng góp của bạn có thể bị thu hồi, xóa hoặc vĩnh viễn đưa ra ngoại tuyến mà không có sự đồng ý của bạn? " Trên Stackoverflow: có. Trên trang web của riêng tôi: không. – Keyvan