Reguläre Ausdrücke: ?-Quantifier unter IE5.0
Jörg Peschke
- javascript
Hallo,
Ich habe ein Problem mit dem IE5.0 - offenbar kann der keine "?"-Quantifier in JavaScript.
Ich habe hierzu als braver SelfHTML-Forums-Benutzer auch bereits die Suche bemüht - leider bringt der "lösungsvorschlag" in diesem Post orginal gar nichts.
Worum es geht:
Ich müsste mit JavaScript aus einem string mehrere Blöcke rausschnippseln, in der form
#START# irgendein text#ENDE#
Sprich ein
funde = text.match(/#START#.*?#ENDE#/g);
nur,wie gesagt, das ? will er nicht.
Weiss jemand, wie man das umgehen könnte?
Viele Grüße,
Jörg
hi,
Ich habe hierzu als braver SelfHTML-Forums-Benutzer auch bereits die Suche bemüht - leider bringt der "lösungsvorschlag" in diesem Post orginal gar nichts.
das, was dort gesagt wurde - nämlich das
funde = text.match(/#START#.*?#ENDE#/g);
.*? erst mal weniog sinnvoll ist in JS-regexp, würde ich aber vermutlich unterschreiben.
nur,wie gesagt, das ? will er nicht.
was willst du denn damit, an dieser stelle?
gruß,
wahsaga
.*? erst mal weniog sinnvoll ist in JS-regexp, würde ich aber vermutlich unterschreiben.
hallo wahsaga,
bin zufälligerweise genau an dem selben ding.
heisst ich will per js-regExp a-tags rausfiltern. da benutz ich grad auch den "mach-mich-ungierig"-operator, also das ?.
und da ist es durchaus sinnvoll, bzw. notwendig den zu verwenden. oder hast du da nen anderen vorschlag?
meine lösung sieht grad so aus:
var regExp = new RegExp("<a(.+?)href\s*=\s*(".*?"|'.*?')(.*?)>(.*?)</a>","i");
var matches = currVal.match(regExp);
gruss schildi, hallo Jörg,
.. da benutz ich grad auch den "mach-mich-ungierig"-operator, also das ?.
und da ist es durchaus sinnvoll, bzw. notwendig den zu verwenden.
oder hast du da nen anderen vorschlag?
@schildi
das hat ja auch niemand in abrede gestellt. Jörg fragt ja nach alternativen
fuer nicht gierige suchmuster, die ohne den dafuer vorgesehene "?" quantifier
auskommen, da man im javascript-bereich immer noch auf RegExp engines stoesst,
die ebendiesen nicht unterstuetzen.
dein zuletzt gegebenes bsp. aufgreifend koennte
eine solche loesung folgendermassen aussehen:
~~~javascript
var str = '<a href="link01.html">link01.html</a>\n' + // matched;
'<a href="about:blank"><about:blank</a>\n' + // not matched;
'<a href="link02.html">link02.html</a>\n' + // matched;
'<a href="about:blank">about:blank</a>'; // matched;
var regX = /<a[^>]>[^<]</a>/gi;
var arr = str.match(regX);
alert(arr.length + "\n\n" + arr.join("\n"));
der ausdruck
`/<a[^>]*>[^<]*<\/a>/gi`{:.language-javascript} liest sich dann so:
/
<a suche die zeichenfolge "<a"
[^>]\* dann alle zeichen, die nicht ">" sind
> bis zum ersten vorkommenden ">"
[^<]\* dem nur nicht-"<"-zeichen nachfolgen
<\/a> bis die sequenz "</a>" gefunden wird
/gi der ausdruck gilt dann fuer den gesamten string
[g(lobal)-flag], wobei die gross/kleinschreibung
ignoriert werden darf [i(gnore case)]-flag
der ausdruck kann aber leider nur dann anwendung finden,
wenn sicher ist, dass keine "<"-zeichen innerhalb der
anker-/link-elemente stehen (siehe obiges bsp.).
by(t)e by(t)e - peterS. - pseliger@gmx.net
--
"Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive." - Douglas Crockford
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
der ausdruck kann aber leider nur dann anwendung finden,
wenn sicher ist, dass keine "<"-zeichen innerhalb der
anker-/link-elemente stehen (siehe obiges bsp.).
danke für die ausführliche beschreibung. aber genau dieses problem mus leider ja verhindert werden, das ein bestimmtes zeichen nicht auftreten darf. sonst hätte ich es ja auch ohne den ? quantifier gemacht.
da muss man wohl langsam abschied nehmen von mr. internet explorer 5.
Hallo,
das, was dort gesagt wurde - nämlich das
funde = text.match(/#START#.*?#ENDE#/g);
.*? erst mal weniog sinnvoll ist in JS-regexp, würde ich aber vermutlich unterschreiben.
Ich will aus einem Text der form
text = "#START# text 1 #ENDE# etz irgendwas anderes #START# text 2 #ENDE# nochmal was";
am Schluss das heraushaben (in Form eines Arrays):
("#START# text 1 #ENDE#", "#START# text 2 #ENDE#")
wenn ich ein gieriges Suchmuster verwende, also:
text.match(/#START#.*#ENDE#/g);
kriege ich:
"#START text1 #ENDE# etz irgendwas anderes #START# text 2 #ENDE#";
Deswegen brauch ich das ?, damits funktioniert.
Ich habe jetzt die folgende Lösung gefunden:
var tokens = text.split("#START#");
var result = new Array();
for (var i = 0; i <tokens.length; i++) {
var sub = tokens[i].match(/.+#ENDE#/);
if (sub) {result[result.length] = "#START#"+sub;}
}
Das funktioniert, ich bekomme in result das, was ich haben will.
Aber ob das die eleganteste Lösung ist, weiss ich nicht.
nur,wie gesagt, das ? will er nicht.
was willst du denn damit, an dieser stelle?
gruß,
wahsaga
gudn tach!
[...] auch bereits die Suche bemüht - leider bringt der "lösungsvorschlag" in diesem Post orginal gar nichts.
das ist wahr.
funde = text.match(/#START#.*?#ENDE#/g);
nur,wie gesagt, das ? will er nicht.Weiss jemand, wie man das umgehen könnte?
ja.
eine moeglichkeit waere, den string zwei mal zu splitten und anschliessend etwaige zusammengehoerende teile wieder zusammenzuwursteln.
wie das so ungefaehr in php geht, steht hier. in javascript sieht es etwas aehnlich aus.
eine andere moeglichkeit waere, in einer schleife mit indexOf() (beachte den zweiten parameter) durch den string zu marschieren.
was effizienter waere, weiss ich nicht. (ausprobieren?)
prost
seth