RegExp als String
ingobar
- javascript
Hallo zusammen,
ich wollte eine kleine Anwendung zum Testen von RegExp schreiben:
____________________________________________________________________
<html><head><title>RegularExpression Tester</title>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<script type="text/javascript">
function testIt() {
document.getElementById("ausgabe").value = "";
//var regExp = document.getElementById("inputRegExp").value;
var regExp = /a(a|b)*/;
var word = document.getElementById("inputWord").value;
var Ergebnis = word.match(regExp);
alert(Ergebnis)
if (Ergebnis != null && Ergebnis[0] == word)
document.getElementById("ausgabe").value = "Wird erfasst";
else
document.getElementById("ausgabe").value = "Wird NICHT erfasst";
}
</script>
</head>
<body>
<h3>Testen von regulären Ausdrücken</h3>
Gib zunächst deinen regulären Ausdruck ein: <input type="input" size="20" id="inputRegExp" value="/a(a|b)*/"><br>
Gib als nächstes ein mögliches Wort ein: <input type="input" size="20" id="inputWord" value="abababa"><br>
<input type="button" size="20" value="Testen" onClick="testIt()"><br>
<input type="input" size="20" id="ausgabe" value="">
</body></html>
____________________________________________________________________
Leider funktioniert er nicht, wenn ich die RegExp über das Feld eingeben. Da es dann wohl als String erkannt wird. Kann mir jemand sagen, ob es da eine Umwandlung gibt, oder wie man das sonst lösen kann?
Hallo,
Leider funktioniert er nicht, wenn ich die RegExp über das Feld eingeben. Da es dann wohl als String erkannt wird. Kann mir jemand sagen, ob es da eine Umwandlung gibt, oder wie man das sonst lösen kann?
Du kannst durch einen "eval" auf einen String eine gültiges RegExp-Objekt erhalten:
var RegExpStr = "/abc/";
var ergebnis = word.match(eval(RegExpStr));
Viele Grüße,
Jörg
Hell-O!
Du kannst durch einen "eval" auf einen String eine gültiges RegExp-Objekt erhalten:
Oder durch explizites Anlegen eines neuen RegExp-Objektes.
Siechfred
Danke. Hat wunderbar geklappt.
gruss ingobar, hallo Jörg,
Danke. Hat wunderbar geklappt.
nur glueck gehabt.
Du kannst durch einen "eval" auf einen String eine gültiges
RegExp-Objekt erhalten:
»»
var RegExpStr = "/abc/";
var ergebnis = word.match(eval(RegExpStr));
das mag fuer kurze tests angehen, ist aber alles andere als sicher.
man wird nicht umhinkommen, den ausdruck zumindest auf die
beiden bestandteile eines RegExp hin abzusuchen - suchmuster/
pattern und flags.
ueber try {...} catch (exc) {...}
und den RegExp-konstruktor
kann dann der versuch gestartet werden, einen regulaeren
ausdruck zusammenzubasteln.
diese vorgehensweise verhindert einen unkontrollierten programm-
abbruch. fuer das gegebene bsp. ist es sogar sinnvoll, die meldung
des ausnahme-ereignisses/exception auszugeben.
umgebaut:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<title>RegularExpression Tester</title>
<script type="text/javascript">
~~~~~~javascript
var testIt = function () {
/*String.prototype.toRegExpString = function () {
return this.replace(/([\^\$\.\*\+\?\=\!\:\|\\\/\(\)\[\]\{\}])/g,"\\$1");
};*/
String.prototype.basicTrim = function () {
return this.replace(/\s+$/,"").replace(/^\s+/,"");
};
var regXSeparator = (/^\/(.*)\/(gim|gmi|img|igm|mgi|mig|gi|ig|gm|mg|im|mi|[gim])*$/);
var regXSource = document.getElementById("inputRegExp");
var output = document.getElementById("feedback");
var regXValue = regXSource.value.basicTrim();
if (regXSeparator.test(regXValue)) {
var regXSeparator = regXSeparator.exec(regXValue); // RegExp.$X is marked deprecated;
var pattern = regXSeparator[1]; // RegExp.$1;
var flags = regXSeparator[2]; // RegExp.$2;
var err, regXTest;
var testText = document.getElementById("inputText").value;
try {
regXTest = new RegExp(pattern, flags);
} catch (exc) {
err = exc;
//alert(exc.message);
}
if (regXTest) {
regXSource.value = regXTest;
//alert("regXValue\t: " + regXValue + "\nregXTest\t: " + regXTest);
//alert(regXTest + ".test(\"" + testText + "\") ? " + regXTest.test(testText));
if (regXTest.test(testText)) {
var resultsArr = testText.match(regXTest);
output.value = "Wird erfasst";
} else {
output.value = "Wird NICHT erfasst";
}
} else {
output.value = "fehlerhafte syntax: " + err.message;
}
} else {
output.value = "fehlerhafte syntax";
}
};
~~~~~~html
</script>
</head>
<body>
<h3>Testen von regulären Ausdrücken</h3>
RegExp: <input type="input" size="56" id="inputRegExp" value="/a(a|b)*/"><br>
Text:<br><textarea cols="49" rows="15" id="inputText">abababa</textarea><br>
<input type="button" size="20" value="Testen" onclick="testIt()">
<input type="input" size="53" id="feedback" value="">
</body>
</html>
by(t)e by(t)e - peterS. - pseliger@gmx.net
hallo again,
var regXSeparator = (/^/(.*)/(gim|gmi|img|igm|mgi|mig|gi|ig|gm|mg|im|mi|[gim])*$/);
-----------------------------------------------------------------------------------^
kleiner aber feiner unterschied - so ist es genau richtig und damit besser:
-----------------------------------------------------------------------------------v
var regXSeparator = (/^\/(.*)\/(gim|gmi|img|igm|mgi|mig|gi|ig|gm|mg|im|mi|[gim])?$/);
so long - peterS. - pseliger@gmx.net
Hi,
Du kannst durch einen "eval" auf einen String eine gültiges RegExp-Objekt erhalten:
(grusel =;-)) Wie war das? "eval is evil"? ;-)
var myRegExp = new RegExp("abc","gi");
var ergebnis = word.match(myRegExp);
Das entspricht dann
var ergebnis = word.match(/abc/gi);
Gruß, Cybaer
Moin,
(grusel =;-)) Wie war das? "eval is evil"? ;-)
So was spricht denn nun gegen eval? Das würde mich ja jetzt doch brennend interessieren, wenn so viele hier auf meiner Lösung rumreiten :)
Hi,
So was spricht denn nun gegen eval?
eval() ist i.d.R. einfach unnützer Overhead, da das eigentlich Erwünschte auch direkt (also schneller) erledigt werden kann (so ja auch hier). Warum dann erst Code extra interpretieren lassen?
Schlimm wird es allerdings, wenn man Code "evaled", der vom Benutzer frei eingegeben werden kann (darauf läuft es ja hier hinaus). Da liegt dann eine veritable Sicherheitslücke vor, da der Benuter dann in der bestehenden Umgebung ggf. beliebigen Code (so auch hier) ausführen kann.
Bei JS sind die daraus resultierenden Sicherheitslücken zwar vergleichsweise gering (also im Vergleich zu z.B. PHP), aber dennoch gegeben.
Aber da sich die Notwendigkeit von eval() (auch hier) ja gar nicht stellt: Hinfort damit.
Gruß, Cybaer
Moin,
eval() ist i.d.R. einfach unnützer Overhead, da das eigentlich Erwünschte auch direkt (also schneller) erledigt werden kann (so ja auch hier). Warum dann erst Code extra interpretieren lassen?
Also den Overhead kann ich hier nicht wirklich erkennen,
denn ob ich ein Objekt aus einem String erzeuge oder den String eval'le, bleibt vom Aufwand her tendeziell gleich, tät ich sagen - in beiden Fällen brauchst Du irgendwas, was den String parsed und entsprechend kovertiert.
Was die Sicherheit angeht, so gebe ich Dir recht - im Serverbereich, bei JavaScript find ichs jetzt nicht so kritisch.
Grüße,
Jörg
gruss Jörg,
Was die Sicherheit angeht, so gebe ich Dir recht - im Serverbereich,
bei JavaScript find ichs jetzt nicht so kritisch.
nun sei mal nicht so hartleibig. zur sicherheit gehoert fuer mich,
auch auf der clientseite nutzereingaben nicht unbesehen weiter-
zuverarbeiten, sondern, wie im bsp. von ingobar, diese auch zu
pruefen.
die direkte evaluation des pattern-strings zu einem RegExp-Objekt
gelingt nur bei korrekter pattern-schreibweise. sobald dem nutzer
des test-tools ein syntaktischen fehler im regexp-muster unterlaeuft,
bricht das programm mit einer unschoenen fehlermeldung ab.
schreib mal folgendes in die javascript-konsole deines bevorzugten
browsers:
var regX = eval("/a(a|b)*/");alert("(regX instanceof RegExp) ? " + (regX instanceof RegExp));
two thumbs up - ok. - und nun mal:
var regX = eval("/a(a|b*/");alert("(regX instanceof RegExp) ? " + (regX instanceof RegExp));
--------------------------^
siehste - na also ;-)
by(t)e by(t)e - peterS. - pseliger@gmx.net
Wahnsinn, was meine simple (so dachte ich) Anfrage hier vom Zaun bricht aber interessant.
Ich werde entsprechend eure Tipps übernehmen und weiterverwurschelt, okay?
Hi,
Was die Sicherheit angeht, so gebe ich Dir recht - im Serverbereich, bei JavaScript find ichs jetzt nicht so kritisch.
Im Privatbereich sicher nicht.
Aber es gibt ja auch abgeschottete Bereich, oder Bereiche, die abgeschottet sein sollten (;-)); z.B. POI/POS-Terminals.
Oder man stelle sich vor, Du surfst im Internet-Cafe, und dein Nachfolger am Platz kann eigene JavaScripts starten, und so ggf. Infos aus Cookies oder sonstwo auslesen, die dort zurückgeblieben sind.
Gruß, Cybaer