Ihre missliche Lage besteht darin, einen Weg zu finden, nur Text-URLs in zu konvertieren anklickbare Links innerhalb von HTML-Inhalten. Allerdings konvertiert das von Ihnen verwendete Muster derzeit unbeabsichtigt auch URLs innerhalb von Tags.
Um dieses Problem zu beheben, Wir werden DOM (Document Object Model) und XPath verwenden. Insbesondere ermöglicht uns XPath, das HTML-Dokument zu durchlaufen und bestimmte Elemente anhand präziser Kriterien auszuwählen. In diesem Fall müssen wir Textknoten identifizieren, die URLs enthalten und keine Nachkommen von Ankerelementen () sind.
Die folgende XPath-Abfrage kann dies effektiv erreichen:
/html/body//text()[ not(ancestor::a) and ( contains(., "http://") or contains(., "https://") or contains(., "ftp://") ) ]
Diese Abfrage berücksichtigt nur Textknoten, die nicht zu Ankern gehören und mindestens eines der unterstützten URL-Protokolle enthalten.
Sobald wir dies getan haben Wenn wir die relevanten Textknoten aufrufen, können wir deren Inhalt mit der PHP-Funktion PREG_REPLACE ändern. So können wir den Text durch entsprechende Ankertags ersetzen:
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); }
Dieser Code erstellt Dokumentfragmente, ändert den Text in jedem Fragment mithilfe des PREG_REPLACE-Musters und ersetzt dann die ursprünglichen Textknoten durch die geänderten Fragmente.
Mit diesem Ansatz können Sie Text-URLs effektiv in anklickbare Links umwandeln und gleichzeitig URLs innerhalb von Tags ausschließen, sodass Sie die gewünschte Funktionalität erhalten.
Das obige ist der detaillierte Inhalt vonWie konvertiere ich URLs in HTML-Text in Links, ohne dass sich dies auf URLs innerhalb von Tags auswirkt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!