2016-04-28 3 views
-1

Wie kann ich HTML-Tag in der Zeichenfolge außer img src und a href entfernen. Ich habe versucht, wie folgt, aber es entfernt alle Tags.Entfernen Sie HTML-Tag außer img src und eine href

SELECT 
    REGEXP_REPLACE('lorem <em>ipsum</em><img src="/folder/file.jpg" /> ipsum','<.*?>') 
FROM DUAL; 

Ergebnis: Lorem Ipsum (Ich mag dieses Lorem ipsum /folder/file.jpg benötigen)

+0

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

+0

@mathguy Nein, er hat nicht, wegen nicht-gieriger Übereinstimmung in eckigen Klammern. – collapsar

+0

@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

Antwort

1

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' 
)