Shameless Stecker:.. Sie können hier (regular expression replace a word by a link) für Inspiration
.
Die Frage wurde gestellt, um ein Wort durch einen bestimmten Link zu ersetzen, es sei denn, es gab bereits einen Link. Das Problem, das Sie haben, ist mehr oder weniger dasselbe.
Alles, was Sie brauchen, ist eine Regex, die eine URL (anstelle des Wortes) entspricht. Die einfachste Annahme wäre wie folgt: Eine URL (optional) beginnt mit "http://"
, oder "mailto:"
und dauert so lange, wie es keine Leerzeichen, Zeilenumbrüche, Tag-Klammern oder Anführungszeichen gibt.
Vorsicht, lange Regex voraus. Wenden Sie Groß- und Kleinschreibung an.
(href\s*=\s*['"]?)?((?:http://|ftp://|mailto:)?[^.,<>"'\s\r\n\t]+(?:\.(?![.<>"'\s\r\n])[^.,!<>"'\s\r\n\t]+)+)
Seien Sie gewarnt - dies wird auch URLs übereinstimmen, die technisch ungültig sind, und es wird things.formatted.like.this als URL erkennen. Es hängt von Ihren Daten ab, ob es zu unempfindlich ist. Ich kann die Regex genau abstimmen, wenn Sie Beispiele haben, in denen sie falsch positive Ergebnisse zurückgibt.
Der Regex erzeugt zwei Match-Gruppen. Gruppe 2 enthält das übereinstimmende Objekt, bei dem es sich höchstwahrscheinlich um eine URL handelt. Gruppe 1 enthält entweder eine leere Zeichenfolge oder eine 'href="'
. Sie können es als Indikator dafür verwenden, dass diese Übereinstimmung innerhalb ein href -Parameter einer vorhandenen Verbindung aufgetreten ist, und Sie müssen diese nicht berühren.
Sobald Sie bestätigen, dass dies das richtige für Sie tut die meiste Zeit (mit Benutzer bereitgestellten Daten, können Sie nie sicher sein), können Sie den Rest in zwei Schritten tun, wie ich es in der anderen vorgeschlagen Frage:
- Machen Sie einen Link an jeder URL ist (es sei denn, gibt es etwas in Übereinstimmung Gruppe 1!) Diese wird produzieren doppelt verschachtelten
<a>
Tags für Dinge, die einen Link bereits haben.
- Scan für
<a>
Tags falsch verschachtelt, überspringen die innerste
Ich habe ein = zum (? ]) zu Beginn hinzugefügt nicht link (nicht kotierte Anker-Tags) zu brechen. Nice regex btw :) – Joel
@Joel: Sind Sie sicher, dass Sie wollen, dass Lookbehind bedeutet "Stellen Sie sicher, dass es unmöglich ist, einen Punkt, ein Sternchen, ein Zitat oder eine schließende Klammer vor der aktuellen Position in der Zeichenfolge"? –