dongpo7467 2011-02-10 19:51
浏览 75
已采纳

php DOMDocument-> getElementById-> nodeValue sripping html

I am using php's DOMDocument->getElementById->nodeValue to set a particular DOM element's HTML. The problem is that the string is converted to HTML entities: eg: nodeValue = html_entity_decode('<b>test</b>'); should output 'test' but instead it outputs '&lt;b&gt;test&lt;/b&gt;'

Any ideas why? This happens even if i don't use the html_entity_decode function

Here is my updated script...which is NOW working:

// Construct a DOM object for updating the affected node
$html = new DOMDocument("1.0", "utf-8"); 
if (!$html) return FALSE;

// Load the HTML file in question
$loaded = $html->loadHTMLFile($data['page_path']);
if (!$loaded)
{
    print 'Failed to load file';
    return FALSE;
}

// Establish the node being updated within the file
foreach ($data['divids'] as $divid)
{
    $element = $html->getElementById($divid);
    if (is_null($element))
    {
        print 'Failed to get existing element';
        return FALSE;
    }

    $newelement = $html->createElement('div');
    if (is_null($newelement))
    {
        print 'Failed to create new element';
        return FALSE;
    }
    $newelement->setAttribute('id', $divid);
    $newelement->setAttribute('class', 'reusable-block');

    // Perform the replacement
    $newelement->nodeValue = $replacement;
    $parent = $element->parentNode;
    $parent->replaceChild($newelement, $element);

    // Save the file back to its location
    $saved = $html->saveHTMLFile($data['page_path']);
    if (!$saved)
    {
        print 'Failed to save file';
        return FALSE;
    }
}

// Replace HTML entities left over
$content = files::readFile($data['page_path']);
$content = str_replace('&lt;', '<', $content);
$content = str_replace('&gt;', '>', $content);
if (!@fwrite($handle, $content))
{
    print 'Failed to replace entities';
    return FALSE;
}
  • 写回答

1条回答 默认 最新

  • dongren9739 2011-02-10 19:56
    关注

    This is proper behavior - your tag is being converted to a string, and strings in XML can't contain angle brackets (only tags can). Try converting the HTML into a DOMNode and appending it instead:

    $node = $mydoc->createElement("b");
    $node->nodeValue = "test";
    $mydoc->getElementById("whatever")->appendChild($node);
    

    Update with working example:

    $html = '<html>
        <body id="myBody">
            <b id="myBTag">my old element</b>
        </body>
    </html>';
    
    $mydoc = new DOMDocument("1.0", "utf-8");
    $mydoc->loadXML($html);
    
    // need to do this to get getElementById() to work
    $all_tags = $mydoc->documentElement->getElementsByTagName("*");
    foreach ($all_tags as $element) {
        $element->setIdAttribute("id", true);
    }
    
    $current_b_tag = $mydoc->getElementById("myBTag");
    $new_b_tag = $mydoc->createElement("b");
    $new_b_tag->nodeValue = "my new element";
    $result = $mydoc->getElementById("myBody");
    $result->replaceChild($new_b_tag, $current_b_tag);
    
    echo $mydoc->saveXML($mydoc->documentElement);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入
  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图