2009-06-23 9 views
0

Ich habe folgendes in einem XHTML-Dokument:Welcher reguläre Ausdruck würde diesen Daten entsprechen?

<script type="text/javascript" id="JSBALLOONS"> 
    function() { 
     this.init = function() { 
      this.wAPI = new widgetAPI('__BALLOONS__'); 
      this.getRssFeed(); 
     }; 
    } 
</script> 

Ich versuche, alles in zwischen den beiden Scripts-Tags auszuwählen. Die id wird immer JSBALLOONS sein, wenn das hilft. Ich weiß, wie ich die Skript-Tags auswählen kann, aber ich weiß nicht, wie ich die Inhalte auswählen soll, mit Ausnahme der Script-Tags. Das Ergebnis des regulären Ausdrucks sollte sein:

function() { 
     this.init = function() { 
      this.wAPI = new widgetAPI('__BALLOONS__'); 
      this.getRssFeed(); 
     }; 
    } 
+1

entfernen Hallo, mein Dank wurde von einem Moderator entfernt!?! FYI, das Ende dieses Beitrags war: Danke, Pete. Ich mag es nicht, wenn Moderatoren meine Beiträge picken, besonders wenn ich meine Höflichkeit wegnehme. – slypete

Antwort

8

(aktualisiert Post speziell für eine Javascript-Lösung.)

In Javascript, Ihr Code könnte wie folgt aussehen:

if (data.match(/<script[^>]+id="JSBALLOONS">([\S\s]*?)<\/script>/)) { 
    inner_script = RegExp.$1; 
} 

That Der Teil zwischen den Klammern ([\S\s]*?) wird von der Regex-Engine gespeichert und ist für Sie zugänglich, nachdem ein Treffer gefunden wurde. In Javascript können Sie RegExp.$1 verwenden, um auf den übereinstimmenden Teil innerhalb der Skript-Tags zu verweisen. Wenn Sie mehr als eine solche Gruppe haben, umgeben von (), können Sie sich darauf mit RegExp.$2 usw. beziehen, bis zu RegExp.$9.

Javascript passt standardmäßig nicht zu Newline-Zeichen, deshalb müssen wir ([\S\s]*?) statt (.*?) verwenden, was mehr Sinn machen kann. In anderen Sprachen ist dies nicht erforderlich, wenn Sie den Modifikator s (/.../s) verwenden.

(ich muss hinzufügen, dass reguläre Ausdrücke der Regel sehr zerbrechlich sind, wenn Inhalte aus HTML-Seiten wie diese kratzen. Sie können besser sein, den jQuery Rahmen mit dem Inhalt zu extrahieren.)

+0

Hallo, danke. Dies ist genau das, was ich habe, aber es enthält die Skript-Tags. Kannst du erklären, was du mit $ 1 meinst? Ich bin nicht vertraut. Vielen Dank! – slypete

+0

@slypete, welche Sprache oder welches Werkzeug benutzen Sie, um die Regex auszuführen? – molf

+0

@molf, benutze ich Javascript und jQuery. var javascript = this.data.match (/ ) + id = "JSBALLOONS"> ([\ S \ s] *?) <\/script>/ig); this.javascript = eval ('(' + javascript + ')'); – slypete

2

Was der Herr bedeutet, durch $ 1 ist "der Wert der ersten Erfassungsgruppe". Wenn Sie einen Teil Ihres regulären Ausdrucks in Klammern einschließen, werden Erfassungsgruppen definiert. Sie zählen sie von links nach rechts. Jede öffnende Klammer startet eine neue Erfassungsgruppe. Sie können verschachtelt sein.

(es Wege gibt, Unterausdrücke zu definieren, ohne Einfanggruppen zu definieren. - Ich die Syntax vergessen)

In Perl, 1 $ die magische Variable ist die Zeichenfolge, die von der ersten Capture-Gruppe abgestimmt zu halten, $ 2 ist der String abgestimmt B. in der zweiten usw. In anderen Sprachen müssen Sie möglicherweise eine Methode für das zurückgegebene Abgleichobjekt aufrufen, um die N-te Erfassungsgruppe zu erhalten.

Aber zurück zu Molfs Lösung. Angenommen, er sagte, dieses Muster zu verwenden, anstatt:

/<script[^>]+id="JSBALLOONS">(.*)<\/script>/ 

In diesem Fall, wenn Sie mehr als ein Skriptelement haben, das falsche Muster auffrisst sie alle, weil sie gierig ist, ein Punkt wert zu erklären. Dieses Muster wird mit dem ersten öffnenden Tag beginnen, mit seinem schließenden Tag übereinstimmen, weitermachen und schließlich mit dem letzten übereinstimmen. Die Magie in Molfs Lösung ist das Fragezeichen in (. *?), Das sie nicht gierig macht. Es wird die kürzeste Zeichenfolge zurückgegeben, die mit dem Muster übereinstimmt, und daher keine zusätzlichen Skriptelemente verschlingen.

+0

Vielen Dank, sehr hilfreich! – slypete

2

Versuchen Sie nicht, reguläre Ausdrücke für nicht-reguläre Sprachen zu verwenden. Der richtige Weg besteht darin, einen XML-Parser zu verwenden.das DOM:

document.getElementById("JSBALLOONS") 

edit: In Bezug auf Ihrem Kommentar, habe ich keine Erfahrung mit JavaScript oder jQuery, aber nach einiger Suche, denke ich, dass etwas in diese Richtung arbeiten soll:

$.ajax({ 
    type: "GET", 
    url: "test.xml", 
    dataType: "xml", 
    success: function(xml) { 
    return $(xml).find("#JSBALLOONS").text(); 
    } 
}); 

Can jemand besser qualifiziert das korrigieren?

+0

Dieser Inhalt ist nicht auf dem DOM, also ich fürchte, es wird nicht funktionieren. – slypete

+0

Das Dokument wird remote in eine Zeichenfolge geladen, aus der ich ausgewählte Objekte extrahieren muss. Ich bin mir bewusst, Regex ist nicht die beste Lösung. Bitte lassen Sie mich wissen, wenn Sie andere Arbeitslösungen kennen. Vielen Dank! – slypete

+0

Noch einmal, es wird nicht funktionieren. Ich habe das versucht. Bitte sehen Sie meine andere allgemeinere Frage für den Grund: http://StackOverflow.com/Questions/1034881/what-ist-best-practice-for-parsing-remote-content-with-jquery Hoffentlich wird jemand sein in der Lage, eine Antwort auf diese Frage zu finden. – slypete

0

Lassen Sie foo die Zeichenfolge sein, die den Code enthält. Dann können Sie die umschließenden Tags über

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<')) 
Verwandte Themen