Votre problème consiste à trouver un moyen de convertir uniquement les URL en texte en liens cliquables dans le contenu HTML. Cependant, actuellement, le modèle que vous utilisez convertit également involontairement les URL dans les balises.
Pour résoudre ce problème, nous utiliserons DOM (Document Object Model) et XPath. Concrètement, XPath nous permet de parcourir le document HTML et de sélectionner des éléments spécifiques en fonction de critères précis. Dans ce cas, nous devons identifier les nœuds de texte qui contiennent des URL et ne sont pas des descendants d'éléments d'ancrage ().
La requête XPath suivante peut effectivement y parvenir :
/html/body//text()[ not(ancestor::a) and ( contains(., "http://") or contains(., "https://") or contains(., "ftp://") ) ]
Cette requête ne prend en compte que les nœuds de texte qui n'appartiennent pas aux ancres et contiennent au moins un des protocoles URL pris en charge.
Une fois que nous avons les nœuds de texte concernés, nous pouvons utiliser la fonction PREG_REPLACE de PHP pour modifier leur contenu. Voici comment nous pouvons remplacer le texte par les balises d'ancrage correspondantes :
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); }
Ce code crée des fragments de document, modifie le texte de chaque fragment à l'aide du modèle PREG_REPLACE, puis remplace les nœuds de texte d'origine par les fragments modifiés.
En suivant cette approche, vous pouvez convertir efficacement les URL de texte en liens cliquables tout en excluant les URL dans les balises, vous offrant ainsi la fonctionnalité souhaitée.
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!