2016-05-12 11 views
-1

zu Streifen habe ich einige invalidly verschachtelte HTML wie:Regex zu HTML-Tag mit bestimmten Attribut

<form class="form1" method="get"> 
    <div> 
     <input name="field1"> 

    </form> 

    <form class="form2" method="get"> 
     <input name="field1"> 
    </form> 

</div> 

Ja, es ist ein Chaos, fragen Sie nicht. Die ungültige Verschachtelung verursacht woanders Probleme. jQuery Ich denke, erwartet eine Schließung </div>, und nur bei der letzten zu finden. Es behandelt dann das zweite <form>-Tag als ungültig und verwirft auch das schließende </form> unmittelbar darüber und nimmt an, dass alles zwischen den Zeilen 1 und 9 ein Formular ist.

Wenn ich diese Ausgabe an die Konsole:

  • $('.form1).html() - alle Linie 1 - 9
  • $('.form2).html() - undefined

Also, was ich versuche, das Ganze zu tun ist, behandeln Ding als String, und verwenden Sie Regex, um Form2 auszuziehen. Ich erwarte einen regex so etwas wie:

formText.replace(/(<form\b[^>]*>)[^<>]*(<\/form>)/gi, ""); 

aber ich bin nicht sicher, wie die spezifische Form mit class=form2 zu verweisen.
Es gibt auch ein Problem mit einer mehrzeiligen Zeichenfolge.

Update: hinzugefügt mehr Details, um zu beschreiben, warum jQuery remove() Methode nicht funktioniert. jQuery denkt nur, dass es leider eine Form gibt.

+3

[Nicht Regex verwenden, um HTML/XML oder andere nicht-reguläre Sprache zu analysieren] (http: // stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contented-tags/1732454#1732454) –

+1

Reparieren Sie nicht defekte HTML. Lass es einfach nicht kaputt gehen. –

+0

@ Frederik.L danke für diesen nützlichen Einblick. – duncan

Antwort

0

ich landete mit:

formText = formText.replace(/(<form\b[^>]*form2+.*>[\s\S]+<\/form>)/gi, ""); 

Die [\s\S] Matches alle Zeichen einschließlich \n und \r die Zeilenumbrüche zu decken.

Ich hätte wahrscheinlich den Teil der Regex, der sich mit dem Klassennamen befasst, genauer machen können, also wusste ich, dass es die Klasse war und nicht irgendeine andere Zufallsform mit einer ähnlichen, aber in der Praxis war es egal (es gab nur eine Instanz der 2. Form, mit einem sehr spezifischen Klassennamen).

+0

Danke auch an https://regex101.com/#javascript – duncan

+0

Wie erhalten Sie eine verwendbare 'FormText', wenn das Formular aus dem DOM entfernt wird? – 4castle

+0

Das 2. Formular wird nicht aus dem DOM entfernt. Wenn ich '$ (.form1) .html()' bekomme, gibt es mir alle Zeilen 1 - 9 – duncan

2

Don't use regex to parse HTML. Da Sie jQuery verwenden, nur .remove() verwenden:

$(function() { 
    $(".form2").remove(); 
}); 

JSFiddle

+0

Das ist schön, leider funktioniert es nicht. Der HTML-Code ist schlechter als meine eingangs skizzierte Frage; Ich werde es aktualisieren, um das eigentliche Problem zu zeigen. Es ist ungültig verschachtelt. Es stellt sich also heraus, dass '$ (" .form2 ")' tatsächlich nicht als HTML-Element existiert. – duncan

+0

@duncan [Es funktioniert für mich.] (Https://jsfiddle.net/mxq4rnyd/2/) Sind Sie sicher, dass nichts anderes das verursacht? Legst du es in einen fertigen Block? – 4castle

+0

Ich denke, mein Beispiel HTML ist nicht genau genug: seine ungültige Struktur. Ich muss ein besseres Beispiel finden, das das Problem tatsächlich zeigt! – duncan

Verwandte Themen