ingobar: RegExp als String

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?

  1. 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

    1. 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

      --
      Ich bin strenggenommen auch nur interessierter Laie. (molily)
      Kabelkuddelmuddel || Steuerfreie Geburtsbeihilfen?  || RT 221 Erfurt-Altstadt i.V.
    2. Danke. Hat wunderbar geklappt.

      1. 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

        --
        »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:]
        1. 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

          --
          »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:]
    3. 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

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
      1. 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 :)

        1. 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

          --
          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
          1. 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

            1. 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

              --
              »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:]
              1. Wahnsinn, was meine simple (so dachte ich) Anfrage hier vom Zaun bricht aber interessant.

                Ich werde entsprechend eure Tipps übernehmen und weiterverwurschelt, okay?

            2. 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

              --
              Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!