如何将str_replace与DomDocument一起使用

时间:2014-08-14 03:53:28

标签: php html web-scraping domdocument

我正在使用DomDocument从页面上的特定div中提取内容。

然后,我想用http://example.com/test/替换路径等于http://example.com/test.php的所有链接实例。

$url = "http://pugetsoundbasketball.com/stackoverflow_sample.php";
$doc = new DomDocument('1.0', 'UTF-8');
$doc->loadHtml(file_get_contents($url));
$div = $doc->getElementById('upcoming_league_dates');
foreach ($div->getElementsByTagName('a') as $item) {
    $item->setAttribute('href', 'http://example.com/test.php');
}
echo $doc->saveHTML($div);

正如您在上面的示例中看到的那样,在我使用str_replace causes定位coming_league_dates div之后出现getElementById个问题。我理解这一点,但不幸的是我不知道从哪里开始!

我尝试了几种不同的方法,包括在str_replace函数上面执行getElementById(我想我可以先替换字符串然后定位特定的div),但没有运气。

我在这里缺少什么?

编辑:更新代码以显示工作解决方案

1 个答案:

答案 0 :(得分:2)

您不能在该节点上使用str_replace。您需要先正确访问它。通过DOMElement类,您可以使用方法->setAttribute()进行替换。

示例:

$url = "http://pugetsoundbasketball.com/stackoverflow_sample.php";
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTMLFile($url);
$xpath = new DOMXpath($dom); // use xpath
$needle = 'http://example.com/test/';
$replacement = 'http://example.com/test.php';
// target the link
$links = $xpath->query("//div[@id='upcoming_league_dates']/a[contains(@href, '$needle')]");
foreach($links as $anchor) {
    // replacement of those href values
    $anchor->setAttribute('href', $replacement);
}

echo $dom->saveHTML();

更新:修改后,您的代码现在仍在运行。这只是为了回答您在上一个问题上的逻辑替换(ala str_replace search / replace)。