Sie müssen den Inhalt des <img
-Tags src
und die <a
-Tag des href
Attribut vor dem Löschen schützen. Die folgende Regex bewahrt nur diese Teile von HTML-Tags in den ursprünglichen Daten:
REGEXP_REPLACE (
REGEXP_REPLACE (
REGEXP_REPLACE (
'lorem <a class="interference" href="http://www.example.com"><em>ipsum</em><img src="/folder/file.jpg" /> ipsum</a> whatever'
, '<a[^>]*? href="([^"]+)"[^>]*>|<img[^>]*? src="([^"]+)"[^>]*>|<a[^>]*? href=''([^'']+)''[^>]*>|<img[^>]*? src=''([^'']+)''[^>]*>'
, '<<\1\2>>'
)
, '([^<])<[^<][^>]*>'
, '\1'
)
, '<<([^>]+)>>'
, ' \1 '
)
Erklärung
- Die Attributwerte in doppelten eckigen Klammern sind gewickelt geschützt werden:
<<
, >>
. Die Übereinstimmung ermöglicht störende Attribute zwischen dem Tag-Namen und dem Zielattribut und für Attributwerte, die entweder durch doppelte oder einfache Anführungszeichen getrennt sind.
- Das Zielattribut ist entweder in einfache Anführungszeichen oder in doppelte Anführungszeichen eingeschlossen. Somit wird in jedem Spiel genau eine Fanggruppe gefüllt. Somit kann die Sequenz von beiden in das Ersatzmuster
'<<\1\2>>'
ohne irgendeine weitere Disambiguierungslogik eingefügt werden.
- Alle Zeichenfolgen, die in einzelne eckige Klammern eingewickelt sind, werden ersetzt
- Entfernen der doppelten Winkelklammern
<<
, >>
.
Caveats
Im Allgemeinen ist es stark entmutigt als Ersatz zu verwenden regexen für die richtige Parsing. Es ist viel fehleranfälliger und viel weniger flexibel und erweiterbar. ein Alptraum zu pflegen und zu debuggen.
Die Übereinstimmung lässt keine doppelten doppelten Anführungszeichen in den Zielattributwerten zu. Dies sollte kein Problem für src
und href
sein; jedoch erwartet, in Schwierigkeiten laufen für das Ziel Attribute wie title
oder data-...
Die Substitutionen nicht mit Daten in Literale, da <
einmischen sollten und >
müssen als Entitäten in HTML dargestellt werden, es sei denn als Syntaxelement verwendet werden. Dies gilt jedoch nicht für xhtml-Daten mit cdata-Abschnitten, in denen das Vorkommen von <<
, >>
verloren wäre. Wenn dies ein Problem sein könnte, testen Sie die ursprüngliche Zeichenfolge auf Vorkommen.
Supplement
Falls Sie die genannten Attributwerte in valides Markup bewahren wollen, schützen Sie die Tags mit der Zielattribute.Zu diesem Zweck verwenden Sie die folgende:
REGEXP_REPLACE (
REGEXP_REPLACE (
REGEXP_REPLACE (
'lorem <a href="http://www.example.com"><em>ipsum</em><img src="/folder/file.jpg" /> ipsum</a> whatever'
, '(<a href|<img src|</a|</img)'
, '<\1'
)
, '([^<])<[^<][^>]*>'
, '\1'
)
, '<(<a href|<img src|</a|</img)'
, '\1'
)
Erklärung
- Die Tags durch eine zusätzliche
<
das Präfix geschützt werden.
- Alle Tags, die nicht mit einem doppelten
<<
beginnen, werden ersetzt
- Rücksubstitution der
<<
Sequenz. Die Substitution wird in dem gleichen Kontext wie die
Caveats prefixing
angewendet Der allgemeine Vorbehalt hält nach wie vor: besser nicht verwenden als Stand-in für Parser regexen .
Um das Ergebnis als gültig zu halten, müssen die passenden Start- und End-Tags erhalten bleiben. Leider kann diese Übereinstimmung nicht mit Oracle-Regexp-Factlities berücksichtigt werden (und ist mit anderen Regex-Engines, die Rekursion unterstützen, sehr kompliziert). Somit werden alle schließenden a
und img
Tags behalten.
Während letztere nur selten in der freien Natur vorkommt (es sei denn, es xhtml ist), wird die frühere Probleme verursachen für <a name="...
Tags.
- Tags mit interferierenden Attributen zwischen dem Elementnamen und den Zielattributen werden gelöscht. Am häufigsten trifft dies auf
class
oder data-
Attribute zu. Catering für diesen Fall macht die Regex komplizierter wieder aufgrund der 4 Varianten unterstützt (Tag-Namen a
/img
, Einzel-/Doppel Zitat Trennzeichen) und potenziell störenden Eigenschaften:
-
REGEXP_REPLACE (
REGEXP_REPLACE (
REGEXP_REPLACE (
REGEXP_REPLACE(
'lorem <a href="http://www.example.com"><em>ipsum</em><img src="/folder/file.jpg" /> ipsum</a> whatever'
, '</(a|img)>'
, '<</\1>'
)
, '<(a)[^>]*?(href="[^"]+"|href=''[^'']+'')[^>]*>|<(img)[^>]*?(src="[^"]+"|src=''[^'']+'')[^>]*>'
, '<<\1\2\3\4>'
)
, '([^<])<[^<][^>]*>'
, '\1'
)
, '<(<a href|<img src|</a|</img)'
, '\1'
)
So Sie müssen Sie nicht nur die Tags entfernen, Sie müssen auch entfernen, was zwischen ihnen ist? In Ihrem Beispiel haben Sie ipsum gelöscht, einschließlich des Wortes ipsum zwischen den Tags und, nicht nur die Tags selbst. – mathguy
@mathguy Nein, er hat nicht, wegen nicht-gieriger Übereinstimmung in eckigen Klammern. – collapsar
@collapsar - Ich habe eine Frage über die Anforderung, so kann die Antwort nicht mit einer Lösung in Verbindung gebracht werden. Schauen Sie sich seinen letzten Satz in Klammern an, wo er die Antwort zeigt, die er WÜNSCHT. – mathguy