PHP – Prolinkování textu v HTML odkazem

Dan Hundrt
Člen | 74
+
0
-

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

dakur
Člen | 493
+
+1
-

@DanHundrt Tohle není moc Nette specifické. Ale načetl bych si asi šablonu do stringu, zkusil pomocí reguláru, jestli je tam slovo Nette a má odkaz a pokud ne, tak bych ho udělal a pak šablonu vypsal.

Martk
Člen | 651
+
-2
-

@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();

TextNodeReplacer

Editoval Martk (23. 11. 2020 10:54)