RegEx, um HTML-Tags ohne spezifisches Attribut zu finden

7

In Java muss ich <a> -Tags in einer Zeichenkette ohne href-Attribut finden. Zum Beispiel in der folgenden Zeichenfolge:

%Vor%

sollte nicht mit <a class="aClass" href="#">link1</a> übereinstimmen (weil es href enthält), aber es sollte mit <a class="aClass" target="_blank">link2</a> übereinstimmen (weil es keine href enthält).

Ich habe es geschafft, die RegEx so zu erstellen, dass sie meinen Tags entspricht:

%Vor%

aber ich kann nicht herausfinden, wie man Tags mit href

eliminiert

(Ich weiß, dass ich HTML-Parser usw. verwenden kann, aber ich muss dies mit RegEx tun.

    
user2287359 19.06.2013, 20:16
quelle

4 Antworten

18

Beschreibung

Seien Sie vorsichtig mit Regexs wie <a[^>]* , da diese auch mit anderen gültigen HTML-Tags übereinstimmen, die mit einem a wie <abbr> oder <address> beginnen. Auch die Suche nach der Zeichenfolge href ist nicht gut genug, da diese Zeichenfolge innerhalb des Werts eines anderen Attributs oder wie <a class="thishrefstuff"... oder Teil eines anderen Attributs wie <a hreflang="en"...

liegen könnte

Dieser Ausdruck wird:

  • stimmt mit allen Anker-Tags überein <a ... </a> , die kein href -Attribut enthalten.
  • Erzwingt die Umsetzung des Tag-Namens a und nicht eines Tags, das einfach mit dem Buchstaben a like <address> beginnt.
  • ignoriere Attribute, bei denen auch der Teilstring href in den Namen des Attributs eingebettet ist, wie das gültige hreflang='en' oder das erfundene Attributehref="some value" .
  • Ignoriere alle Zeichen im Wertebereich aller korrekt formatierten Attribute wie bogus='href=""'

<a(?=\s|>)(?!(?:[^>=]|=(['"])(?:(?!).)*)*?\shref=['"])[^>]*>.*?<\/a>

Erweitert

  • <a(?=\s|>) stimmt mit dem offenen Tag überein und stellt sicher, dass der nächste Name nach dem Tag entweder ein Leerzeichen oder die schließende Klammer ist. Dies zwingt den Namen zu a und nicht zu etwas anderem
  • (?! startet den negativen Blick voraus, wenn wir eine href in diesem Tag finden, dann ist diese Art von Tag nicht das Tag, nach dem wir suchen
    • (?: startet die Nicht-Capture-Gruppe, um sich durch alle Zeichen innerhalb des Tags zu bewegen
    • [^>=] stimmt mit allen nicht abschließenden Zeichen überein, wodurch verhindert wird, dass die Regex-Engine das Tag verlässt, und ungleiche Zeichen, die verhindern, dass die Engine blind mit allen Zeichen übereinstimmt
    • | oder
    • =(['"]) entspricht einem Gleichheitszeichen, gefolgt von einem offenen Doppel- oder einfachen Anführungszeichen. Das Zitat wird in Gruppe 2 aufgenommen, damit es später korrekt gepaart werden kann
    • (?:(?!).)* stimmt mit allen Zeichen überein, die nicht das enge Zitat sind, das dem offenen Zitat
    • entspricht
    • stimmt mit dem korrekten nahen Zitat
    • überein
    • )*? schließt die Nicht-Capture-Gruppe und wiederholt so oft wie nötig bis
    • \shref=['"] stimmt mit dem gewünschten href-Attribut überein. Die \s und =["'] stellen sicher, dass der Attributname einfach href
    • lautet
    • ) schließt den negativen Lookahead
  • [^>]*>.*?<\/a> entspricht der gesamten Zeichenfolge von "Öffnen" bis "Schließen"

Java Code Beispiel:

Eingabetext

<abbr>RADIO</abbr> text <a class="aClass" href="#">link1</a> text <a bogus='href=""' class="aClass" target="_blank">link2</a> text

Code

Wenn Sie dies in einer Replace-Funktion verwenden möchten, um nicht-href-anchor-Tags zu entfernen, ersetzen Sie einfach alle Treffer durch nichts.

%Vor%

Entspricht

%Vor%     
Ro Yo Mi 20.06.2013, 02:06
quelle
4

Ich finde es merkwürdig, dass Sie brauchen , um es mit Regex zu tun, aber Sie können einen negativen Lookahead verwenden.

%Vor%     
Explosion Pills 19.06.2013 20:21
quelle
0

Ich bin kein Java-Experte, aber Sie können so etwas ausprobieren:

%Vor%     
Casimir et Hippolyte 19.06.2013 20:54
quelle
-1

Eine Option, die Sie haben, besteht darin, alle -Tags zuerst zu suchen und dann eine Regex zu verwenden, um diejenigen zu finden, die Sie haben, so dass Sie sie ignorieren können. So würde Ihr Pseudocode aussehen:

%Vor%     
David Grinberg 19.06.2013 20:23
quelle

Tags und Links