Problème : La conversion des URL de texte en hyperliens peut être une tâche utile, mais cela devient difficile lorsque les images ou d'autres éléments contenus dans les balises HTML contiennent également des URL. Dans un cas spécifique, l'utilisateur cherche un moyen de remplacer les URL de texte par des balises d'ancrage tout en évitant de remplacer les URL intégrées dans les attributs de la source de l'image.
Solution :
La clé pour résoudre ce problème consiste à utiliser une expression XPath pour sélectionner uniquement les nœuds de texte qui contiennent des URL mais qui ne sont pas des descendants d'éléments d'ancrage.
Voici une version raffinée de l'expression XPath :
$xPath = new DOMXPath($dom); $texts = $xPath->query( '/html/body//text()[ not(ancestor::a) and ( contains(.,"http://") or contains(.,"https://") or contains(.,"ftp://") )]' );
Cette expression exclut effectivement les nœuds de texte contenus dans les balises d'ancrage, garantissant ainsi que seules les URL en texte brut sont ciblées pour la conversion.
Remplacement des URL de texte sans affecter les URL d'image :
Pour éviter de remplacer les URL intégrées dans les attributs de la source de l'image, une approche non standard mais efficace est utilisée. Au lieu de diviser les nœuds de texte, un fragment de document est utilisé pour remplacer le nœud de texte entier par la version modifiée.
Voici le code qui effectue cette tâche :
foreach ($texts as $text) { $fragment = $dom->createDocumentFragment(); $fragment->appendXML( preg_replace( "~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)~i", '<a href=""></a>', $text->data ) ); $text->parentNode->replaceChild($fragment, $text); }
Dans ce code, la fonction preg_replace est utilisée pour rechercher des URL dans le nœud de texte et les remplacer par leurs versions de balises d'ancrage correspondantes.
Exemple :
Considérez le code HTML suivant :
<code class="html"><html> <body> <p> This is a text with a <a href="http://example.com/1">link</a> and another <a href="http://example.com/2">http://example.com/2</a> and also another http://example.com with the latter being the only one that should be replaced. There is also images in this text, like <img src="http://example.com/foo"/> but these should not be replaced either. In fact, only URLs in text that is no a descendant of an anchor element should be converted to a link. </p> </body> </html></code>
L'application de la solution ci-dessus convertira les URL de texte en balises d'ancrage tout en laissant l'URL de l'image intacte, produisant le résultat suivant :
<code class="html"><html><body> <p> This is a text with a <a href="http://example.com/1">link</a> and another <a href="http://example.com/2">http://example.com/2</a> and also another <a href="http://example.com">http://example.com</a> with the latter being the only one that should be replaced. There is also images in this text, like <img src="http://example.com/foo"/> but these should not be replaced either. In fact, only URLs in text that is no a descendant of an anchor element should be converted to a link. </p> </body></html></code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!