gpt4 book ai didi

php - 通过 php dom 通过 html 片段中的超链接查找和替换关键字

转载 作者:太空狗 更新时间:2023-10-29 15:06:51 25 4
gpt4 key购买 nike

我正在尝试使用 simple_html_dom php 类创建一个查找和替换函数,该函数查找关键字并通过指向关键字定义的链接替换它们,关键字作为链接文本。

如何找到“Dexia”并将其替换为 <a href="info.php?tag=dexia">Dexia</a>使用此类,在一个字符串中,例如 <div><p>The CEO of the Dexia bank has just decided to retire.</p></div>

最佳答案

这有点棘手,但你可以这样做:

$html = <<< HTML
<div><p>The CEO of the Dexia bank <em>has</em> just decided to retire.</p></div>
HTML;

我添加了一个强调元素只是为了说明它也适用于内联元素。

设置

$dom = new DOMDocument;
$dom->formatOutput = TRUE;
$dom->loadXML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//text()[contains(., "Dexia")]');

当然上面有趣的是XPath。它在加载的 DOM 中查询所有包含针“Dexia”的 DOMText 节点。结果是 DOMNodeList(和往常一样)。

替换

foreach($nodes as $node) {
$link = '<a href="info.php?tag=dexia">Dexia</a>';
$replaced = str_replace('Dexia', $link, $node->wholeText);
$newNode = $dom->createDocumentFragment();
$newNode->appendXML($replaced);
$node->parentNode->replaceChild($newNode, $node);
}
echo $dom->saveXML($dom->documentElement);

找到的 $node 将包含字符串 The CEO of the Dexia bank for wholeText,尽管它在 P 中 元素。这是因为 $node 有一个兄弟 DOMElement,在 bank 之后有强调。我将链接创建为字符串而不是节点,并用它替换 wholeText 中出现的所有“Dexia”(无论单词边界如何 - 这对 Regex 来说是一个很好的调用)。然后我从生成的字符串创建一个 DocumentFragment 并用它替换 DOMText 节点。

W3C 与 PHP

使用 DocumentFragement::applyXML()是一种非标准方法,因为该方法不是 W3C DOM 规范的一部分。

如果您想用标准 API 进行替换,您首先必须创建 A 元素作为新的 DOMElement。然后你必须在 DOMTextnodeValue 中找到“Dexia”的偏移量,并将 DOMText 节点拆分为两个节点位置。从返回的兄弟中移除 Dexia,并在第二个之前插入链接元素。对兄弟节点重复此过程,直到在该节点中找不到更多 Dexia 字符串。以下是针对一次 Dexia 的处理方法:

foreach($nodes as $node) {
$link = $dom->createElement('a', 'Dexia');
$link->setAttribute('href', 'info.php?tag=dexia');
$offset = strpos($node->nodeValue, 'Dexia');
$newNode = $node->splitText($offset);
$newNode->deleteData(0, strlen('Dexia'));
$node->parentNode->insertBefore($link, $newNode);
}

最后是输出

<div>
<p>The CEO of the <a href="info.php?tag=dexia">Dexia</a> bank <em>has</em> just decided to retire.</p>
</div>

关于php - 通过 php dom 通过 html 片段中的超链接查找和替换关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3151064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com