Maison > développement back-end > tutoriel php > Comment remplacer les URL de texte par des hyperliens tout en excluant les URL dans les balises HTML ?

Comment remplacer les URL de texte par des hyperliens tout en excluant les URL dans les balises HTML ?

Mary-Kate Olsen
Libérer: 2024-10-28 06:28:02
original
1105 Les gens l'ont consulté

How to Replace Text URLs with Hyperlinks While Excluding URLs within HTML Tags?

Surmonter le défi du remplacement des URL de texte tout en excluant les URL dans les balises HTML

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://") )]'
);
Copier après la connexion

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(
            &quot;~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\&quot;|'|:|\<|$|\.\s)~i&quot;,
            '<a href=&quot;&quot;></a>',
            $text->data
        )
    );
    $text->parentNode->replaceChild($fragment, $text);
}
Copier après la connexion

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=&quot;http://example.com/1&quot;>link</a>
    and another <a href=&quot;http://example.com/2&quot;>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=&quot;http://example.com/foo&quot;/> 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>
Copier après la connexion

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=&quot;http://example.com/1&quot;>link</a>
    and another <a href=&quot;http://example.com/2&quot;>http://example.com/2</a>
    and also another <a href=&quot;http://example.com&quot;>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=&quot;http://example.com/foo&quot;/> 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal