PHP – Prolinkování textu v HTML odkazem
- Dan Hundrt
- Člen | 74
Zdravím,
potřeboval bych nakopnout, jak např. v textu:
<h1>Novinky v Nette 3.0</h1>
<p>Prohlédněte si novinky v Nette 3.0.</p>
Nahradit např. string „Nette“ za odkaz, čili:
<h1>Novinky v Nette 3.0</h1>
<p>Prohlédněte si novinky v <a href="https://nette.org/en/">Nette</a> 3.0.</p>
Dokázal by někdo nakopnout, jak prolinkovat jen text v odstavci a ev. ošetřit, zda není text již prolinkovaný?
Děkuji
- Martk
- Člen | 661
@DanHundrt Dělám to tak, že si načtu celý dokument do DOMDocument a tam už je práce s elementy snadnější, příjemnější a spolehlivější než s regexem, ovšem regex je taky cesta.
Na tvůj problém bych použil něco jako:
function hasParentTag(DOMNode $node, string $tag) {
while ($node = $node->parentNode) {
if ($node->nodeName === $tag) {
return true;
}
}
return false;
}
$parser = new Html5DocumentParser();
$object = $parser->parseHtml('<h1>Novinky v Nette 3.0</h1>
<p>Prohlédněte si novinky v Nette 3.0.</p>');
$linkReplacer = new TextNodeReplacer();
$linkReplacer->setValidator(function (DOMNode $node): bool {
if (!hasParentTag($node, 'p')) {
return false;
}
return !hasParentTag($node, 'a');
});
$linkReplacer->setSplitCallback('Nette', function (string $content, DOMDocument $document) {
$link = $document->createElement('a', $content);
$link->setAttribute('href', 'https://nette.org/en/');
return $link;
});
$linkReplacer->replace($object->getDocument());
echo $object->toString();
Editoval Martk (23. 11. 2020 10:54)