php dom replacementChild,另存为html并继续解析

时间:2016-02-01 21:24:48

标签: php dom replace

我创建了一个php解析器,用于编辑由CMS创建的html。我要做的第一件事就是解析一个自定义标签来添加模块。

之后,如果需要更新,更改或w / e等链接,图像等。这一切都有效。

现在我注意到,当一个自定义标签被替换为生成的模块的html时,其他操作不会处理这个html。

例如;带有/ pagelink-001的href的所有链接都将替换为当前页面的实际链接。这适用于初始加载的html,而不是替换的标记。下面我有一个简短的代码版本。我尝试使用saveHtml()保存它并使用loadHtml()和类似的东西加载它。

我猜这是因为带有加载的html的$ doc没有更新。

我的代码:

$html = '<a href="/pagelink-001">Link1</a><customtag></customtag>';

// Load the html (all other settings are not shown to keep it simple. Can be added if this is important)   
$doc->loadHTML($html);

// Replace custom tag
foreach($xpath->query('//customtag') as $module)
{
    // Create fragment
    $return = $doc->createDocumentFragment();

    // Check the kind of module
    switch($module)
    {
        case 'news':
            $html = $this->ZendActionHelperThatReturnsHtml;
            // <div class="news"><a href="/pagelink-002">Link2</a></div>
        break;
    }

    // Fill fragment
    $return->appendXML($html);

    // Replace tag with html
    $module->parentNode->replaceChild($return, $module);
}

foreach($doc->getElementsByTagName('a') as $link)
{
    // Replace the the /pagelink with a correct link
}

在此示例中,Link1 href替换为正确的值,但Link2不是。{ Link2确实正确显示为一个链接,一切正常。

如何使用新的html更新$ doc的任何指示,或者如果确实是问题那将是非常棒的。或者请告诉我,如果我完全错了(以及在哪里看)!

提前致谢!!

1 个答案:

答案 0 :(得分:0)

似乎我是对的,返回的字符串是一个字符串而不是html。我在代码中发现了@Keyvan的innerHtml函数,我在某个时候实现了它。这导致我的功能是:

// Start with the modules, so all that content can be fixed as well
foreach($xpath->query('//customtag') as $module)
{
    // Create fragment
    $fragment = $doc->createDocumentFragment();

    // Check the kind of module
    switch($module)
    {
        case 'news':
            $html = htmlspecialchars_decode($this->ZendActionHelperThatReturnsHtml); // Note htmlspecialchars_decode!
        break;
    }

    // Set contents as innerHtml instead of string
    $module->innerHTML = $html;

    // Append child
    $fragment->appendChild($module->childNodes->item(0));

    // Replace tag with html
    $module->parentNode->replaceChild($fragment, $module);
}