【问题标题】:How do I use str_replace with DomDocument如何将 str_replace 与 DomDocument 一起使用
【发布时间】:2014-08-14 03:53:27
【问题描述】:

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

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

$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 在我使用getElementById 定位到即将到来的_league_dates div 后出现问题。我明白这一点,但不幸的是我不知道从哪里开始!

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

我在这里错过了什么?

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

【问题讨论】:

  • 看起来该网页有很多重复的 ID。 HTML 解析器会讨厌这样的!
  • 另外,这对我来说是 TL;DR 点。请提供一些不那么长的示例 HTML。
  • @scrowler 我更新了代码以拉出一个带有文本的简单页面。我不确定这是否是您的要求
  • 更好 - 但现在您的文件没有 ID 为即将到来的联赛日期的元素。为了给出一个可重现的例子,你应该提供尽可能小的代码块让别人重现你的问题。例如。具有该 id 的 div,填充您要替换的链接或您提供的一堆文本。
  • 一个 DOMElement 可以被 $element->setAttribute("href", ...) 之类的语句操作。如果您阅读文档,您会发现它不是一个简单的字符串操作 API,而是一个具有操作属性的方法的对象。即 DOMElement 不是字符串,而是具有 API 的对象。

标签: php html web-scraping domdocument


【解决方案1】:

您不能只在该节点上使用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 搜索/替换)。

【讨论】:

  • 感谢@Ghost 的解决方案!当有多个具有不同路径的链接并且我需要专门更改一些时,您的解决方案非常有用。我将来会使用它。幸运的是,相关页面上的所有链接都具有相同的路径,因此我能够使用更通用的解决方案。
  • @cpcdev 是的,我认为这更像是搜索特定路径(针搜索)并替换为替换,所以这就是我在修订之前起草我的答案以遵循该逻辑的方式。欢迎您,很高兴它也有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多