Regulären Ausdruck für die Wörter oder Ausdrücke im string aber NICHT überein, wenn Sie Teil einer URL oder innen - <a> </a> tags. (php)
Ich bin mir bewusst, dass die regex ist nicht ideal für die Verwendung mit HTML-Zeichenfolgen, und ich habe mir bei der PHP Simple HTML DOM-Parser, aber immer noch glauben, dass dies der Weg zu gehen. Alle HTML-tags werden generiert durch meine forum-software, so dass Sie konsistent und gültig HTML.
Was ich versuche zu machen, ist ein plugin, dass die Liste der Stichwörter (oder Wortgruppen) in ein HTML-string und ersetzen Sie Sie mit einem link, den ich angeben. Zum Beispiel, wenn jemand Typen:
I use Amazon for that.
es würde ersetzen Sie es mit:
I use <a href="http://www.amazon.com">Amazon</a> for that.
Das problem ist natürlich, dass, wenn "amazon" ist in der URL, es würde auch ersetzt zu bekommen. Ich löste das Problem mit einer callback-Funktion auf dieser Website leicht modifiziert.
Aber jetzt habe ich immer noch ein Problem haben, es noch ersetzt Wörter zwischen öffnenden und schließenden tags.
<a href="http://www.amazon.com">My Amazon Link</a>
Es wird mit dem "Amazon" in "Mein Amazon-Link"
Was ich wirklich brauche, ist ein regex-match sagen "amazon" überall, außer zwischen <a href
und </a>
Irgendwelche Ideen?
- eine Suche, diese Frage wurde bereits beantwortet millionenfach
- fwiw habe ich die Suche und ich betrachtete jeden Vorschlag, den ich bekam, als ich in das Thema. Ich war wohl Phrasierung es schlecht, aber ich war auf der Suche für 2 Tage.
- Nur ein follow-up. In Tests habe ich festgestellt, dass, wenn jemand hatte ein Bild-tag <img> ein amazon-Quelle würde es auch versuchen, zu konvertieren, das Wort innerhalb der <img> tag, um einen link als gut. Ich veränderte die regex zu ignorieren <img> tags (auch XHTML image-tags, in der Tat, alle XHTML-tags): (?![^<]*</a>|" />))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die Verwendung des DOM wäre sicherlich vorzuziehen.
Allerdings könnte man mit diesem Weg:
Passt es
Amazon
nur, wenn</a>
tag,<a>
tags.Es wird sich daher ändern diese:
in diesem:
Tun das nicht. Sie können nicht zuverlässig, das mit Regex, egal, wie konsequent Sie Ihre HTML-ist.
Etwas, wie das funktionieren sollte, jedoch:
Es ist ausführlich, aber es funktioniert tatsächlich.
Amazon
, und ändern Sie diewhile
Schleife zu überprüfen, für mehr als eine Sache. Dies sollte nicht allzu schwierig sein.Versuchen, diese hier
Dieser wird nach Amazon und dem negativen lookahead-Funktion sorgt dafür, dass es kein schließendes tag hinter sich. Und ich Suche es nur nicht für
<
so dass ich es nicht Lesen-ein Start-tag versehen.http://regexr.com
Leider denke ich, dass die Logik, die Sie brauchen, ist noch komplexer als text-pattern-matching :-/
Ich weiß, es ist nicht die Antwort, die Sie hören wollen, aber Sie werden wahrscheinlich bessere Ergebnisse mit einem DOM-Modell.
Hier eine Diskussion zu diesem Thema anderswo: http://coderzone.org/forum/index.php?topic=84.0
Ist es möglich, führen Sie einfach den filter einmal, so dass Sie am Ende nicht mit dupes? Oder könnte der ursprüngliche Korpus auch links?
Joe, er diese Frage, denn es hatte eine einfache Lösung, war nicht erwähnt. (Fand Ihre Frage, während Sie einige der Forschung für eine Allgemeine Frage zu so schließen Sie Muster in regex.)
Mit all den Verzichtserklärungen über die Verwendung von regex zum Parsen von html, hier ist eine einfache Möglichkeit, es zu tun.
Hier ist unsere einfache regex:
Der linken Seite des Wechsel-matches komplett
<a... </a>
- tags, dann absichtlich fehlschlägt. Die Rechte Seite entsprichtamazon
, und wir wissen, dass dies die richtigeamazon
weil es nicht angepasst worden, indem der Ausdruck auf der linken Seite.Dieses Programm zeigt, wie der regex (siehe Ergebnisse unten auf der online-demo):
Referenz
Wie passend (oder ersetzen) ein Muster, außer in Situationen, s1, s2, s3...
Verwenden Sie diesen code:
- AUSGANG
Improvisation. Es sollte der link nur, wenn es ein " ganzes Wort "Amazon" und nicht Wörter wie AmazonWorld.