2009-05-18 12 views
1

Ich versuche, alle Vorkommen von Elementen in HTML-Seite zu finden, die zwischen <nobr> und </nobr> Tags sind. EDIT: (. Nobr ist ein Beispiel brauche ich Gehalt zwischen zufälligen Zeichenfolge zu finden, die nicht immer Tags)regulärer Ausdruck (Javascript) Wie man alles zwischen zwei Tags beliebig oft anpasst

ich versuchte, diesen

var match = /<nobr>(.*?)<\/nobr>/img.exec(document.documentElement.innerHTML); 
alert (match); 

Aber es gibt nur ein Vorkommen. + Es erscheint zweimal, einmal mit den <nobr></nobr> Tags und einmal ohne sie. Ich brauche nur die Version ohne die Tags.

+0

Welches Ergebnis erhalten Sie, wenn Sie tun string.match (regex) statt regex.exec (string)? – nickf

+0

Ihre Frage bezieht sich auf globale Submatches in Javascript - (http: // Stackoverflow.com/questions/844001/javascript-regex-and-submatches) –

Antwort

5

müssen Sie es in einer Schleife

var match, re = /<nobr>(.*?)<\/nobr>/img; 
while((match = re.exec(document.documentElement.innerHTML)) !== null){ 
    alert(match[1]); 
} 
+1

Dieses "! == null" wird nicht benötigt. Der Ausdruck wird ohne ihn als falsch gewertet. – James

5

das DOM

var nobrs = document.getElementsByTagName("nobr") 

verwenden und Sie können dann die Schleife durch alle nobrs und die Innerhtml extrahieren oder eine andere Aktion auf sie anwenden.

+0

Das ist eine großartige Lösung, aber ich brauche eine allgemeine Lösung für jedes Muster in der HTML-Datei, nicht nur Standard-Tags – Nir

+0

getElementsByTagName() wird für jede gut gebildete XML in der funktionieren Dokument, nicht nur gültige XHTML-Tags. – Bell

+0

Vielleicht sollten Sie dies in Ihrer Frage angeben. – annakata

1

Sie

while (match = /<nobr>(.*?)<\/nobr>/img.exec("foo <nobr> hello </nobr> bar <nobr> world </nobr> foobar")) 
    alert (match[1]); 
+0

Danke! Jetzt habe ich es bekommen – Nir

+0

Stellt sich heraus, es gibt einen Fehler in IE, wenn eine while-Schleife wie diese. Rafaels Weg sollte funktionieren – Nir

2

verwenden können, tun (Da ich nicht auf Rafaels richtige Antwort kommentieren ...)

exec ist tun, was es tun soll - die erste Übereinstimmung finden, das Ergebnis im Objekt match zurückgeben und Sie für den nächsten Aufruf exec einrichten. Das Objekt match enthält (bei Index 0) die gesamte Zeichenfolge, die durch die gesamte Regex abgeglichen wird. In nachfolgenden Slots sind die Bits der Zeichenfolge durch die eingeklammerten Untergruppen abgestimmt. So enthält match[1] das Bit der Zeichenfolge, die in Ihrem Beispiel mit "(. *?)" Übereinstimmt.

1

Wenn die Zeichenfolgen, die Sie verwenden, keine XML-Elemente sind und Sie mit Regexes arbeiten, kann der Rückgabewert, den Sie erhalten, durch die Klammerung erklärt werden. .exec gibt die gesamte übereinstimmende Zeichenfolge gefolgt vom Inhalt der Klammerausdrücke zurück.

Wenn Ihr Dokument enthält:

 
This is out.
Bzz. This is in. unBzz.

dann

/Bzz.(.*?)unBzz./img.exec(document.documentElement.innerHTML)

geben Sie ‚BZZ. Das ist in. UnBzz. ' in Element 0 des zurückgegebenen Arrays und 'Dies ist in.' in Element 1. Der Versuch, das ganze Array anzuzeigen, gibt beide als eine durch Kommas getrennte Liste, weil das ist, was JavaScript versucht, es anzuzeigen.

So alert($match[1]); ist, was Sie suchen.

1

es braucht, um Schritte, aber man könnte es tun, wie diese

match = document.documentElement.innerHTML.match(/<nobr>(.*?)<\/nobr>/img) 
alert(match)//includes '<nobr>' 

match_length = match.length; 
for (var i = 0; i < match_length; i++) 
{ 
    var match2 = match[i].match(/<nobr>(.*?)<\/nobr>/im);//same regex without the g option 
    alert(match2[1]); 
} 
Verwandte Themen