Regulärer Ausdruck für HTML-Tag
cridde
- javascript
Hallo!
Ich möchte mir gerne aus einem HTML-Text, der in einer Variable gespeichert ist, die gesamten HTML-Tags auflisten lassen.
Die schließenden Tags sollen dabei nicht berücksichtigt werden, nur die öffnenden.
Beispiel: <P>Kleines<strong>Beispiel</STRONG></p>
Hier sollte ich nun ein Array bekommen mit zwei Einträgen: 'P' und 'STRONG'.
Ich probiere schon dauernd an einem regulären Ausdruck herum, werde aber leider nicht fündig.
Danke!
cridde
Hallo Criddie!
Tut's der hier villeicht?
"#<([a-zA-Z0-9]*)>#"
Wenn du strong ins STRONG umwandeln möchtest, müßtest du halt hinterher nochmal mit einer entsprechenden Funktion drübergehen.
Gruß
Matthias
Neh, der hat leider nicht funktioniert..
hi!
Neh, der hat leider nicht funktioniert..
und was ist damit:
/<(\w+)(\s[^>]*)?>/g
das setzt allerdings voraus, dass nicht etwas wie
<img src="oogle.jpg" [zeilenumbruch]
alt="foogle">
vorkommt.
im ergebnis-array ist dann uebrigens nur jedes zweite element relevant.
falls js mit richtigen regexp umgehen kann, dann sollte auch /<(\w+)(?:\s[^>]*)?>/g funzen. dann werden naemlich nur die von dir gewuenschten daten aufgesammelt.
prost
seth
In beiden Fällen enthält das Array '<p>','p' in '<p>Hallo, das ist ein <strong>Test</strong></p>', 'strong' vergisst er irgendwie.
Vielleicht noch eine Idee?
hi!
In beiden Fällen enthält das Array '<p>','p' in '<p>Hallo, das ist ein <strong>Test</strong></p>', 'strong' vergisst er irgendwie.
Vielleicht noch eine Idee?
also, so ein mist! ich glaube, ich verstehe die javascript-regexp nicht mehr. mit dem /g das wollte irgendwie ueberhaupt nicht wie ich will.
naja, dann eben ohne /g:
function collect_html(str){
var html_tags=new Array();
var str_split=str.split("<");
var html_tag;
for(i=0;i<str_split.length;++i){
html_tag=str_split[i].match(/^\w+/);
if(html_tag) html_tags.push(html_tag);
}
return html_tags;
}
(oder gibt's auch html-tags mit zahlen?)
prost
seth
Hallo,
(oder gibt's auch html-tags mit zahlen?)
Ja: h1, h2 usw.
Grüße,
Utz
Hallo,
In beiden Fällen enthält das Array '<p>','p' in '<p>Hallo, das ist ein <strong>Test</strong></p>', 'strong' vergisst er irgendwie.
Vielleicht noch eine Idee?
also, so ein mist! ich glaube, ich verstehe die javascript-regexp nicht mehr. mit dem /g das wollte irgendwie ueberhaupt nicht wie ich will.
Dein Ansatz war schon okay. Der g-Flag bedeutet nur, dass man exec() mehrfach aufrufen kann und nicht, dass beim ersten Aufruf RegExp.$1 etwa ein Array mit allen Treffern ist (wie z.B. in PHP bei preg_match_all()). Bei einem exec() werden RegExp.$1 usw. immer nur mit den Teiltreffern einer Anwendung des Regulären Ausdrucks gefüllt. Mit einer while-Schleife kann man exec() so oft ausführen, bis der gesamte String durchlaufen ist und keine Treffer mehr geliefert werden. exec() gibt dann false zurück.
<html>
<head>
<script type="text/javascript">
window.onload = function () {
var str = document.getElementById('a').innerHTML;
var expr = /<([a-z0-9]+)(?:\s[^>]*)?>/gi;
var matches = new Array();
while (expr.exec(str)) {
matches[matches.length] = RegExp.$1;
}
window.alert(matches);
}
</script>
</head>
<body>
<div id="a">bla <p>bla <strong>bla</strong> bla</p> bla</div>
</body>
</html>
(?:...) funktioniert gemäß ECMAScript, wäre aber in dem Fall sowieso unnötig.
Mathias
Hi Matthias!
Vielen Dank - Das war's!
Jetzt funktioniert es.
Viele Grüße,
cridde
hi!
Der g-Flag bedeutet nur, dass man exec() mehrfach aufrufen kann und nicht, dass beim ersten Aufruf RegExp.$1 etwa ein Array mit allen Treffern ist (wie z.B. in PHP bei preg_match_all()).
och, na super! ich hatte mir ja sogar sowas gedacht und deshalb ein wenig (in einer schleife) mit \G herumexperimentiert, was sich jedoch als griff ins klo herausstellte. haette ich das einfach weggelassen, haette es gefunzt. so ein kack! ;-)
(?:...) funktioniert gemäß ECMAScript, wäre aber in dem Fall sowieso unnötig.
naja, aber "It's also cheaper not to capture characters if you don't need to." (http://www.perldoc.com/perl5.8.4/pod/perlre.html)
prost
seth