Dominique Stender: strings bearbeiten

Hallo zusammen.

Ich habe eine URL (incl CGI Aufruf) in einem String abgelegt und muß diesen jetzt gemäß den 'Richtlinien' bearbeiten. Im einzelnen heißt das z.B. ein Leerzeichen durch '+' zu ersetzen und ähnliches. Seitens meines Arbeitgebers habe ich recht strenge Vorgaben, also kann ich nicht mir Perl arbeiten und muß bis NS 3.02 abwärtskompatibel sein.
Dadurch fallen Sachen wie Url.replace(regExp, teilstring) von vornherein raus.
Gibt es noch weitere Methoden o.ä., die auch schon ab NS 3.02 verfügbar waren?

Danke!
   Dominique

  1. Hallo Dominique

    Seitens meines Arbeitgebers habe ich recht strenge Vorgaben, also kann ich nicht mir Perl arbeiten und muß bis NS 3.02 abwärtskompatibel sein.

    Oh mann, was ist denn das fuer ein Sklaventreiber?! (nicht wegen NS3, sondern wegen Perl)

    Dadurch fallen Sachen wie Url.replace(regExp, teilstring) von vornherein raus.
    Gibt es noch weitere Methoden o.ä., die auch schon ab NS 3.02 verfügbar waren?

    Schau mal nach escape()/unescape() auf <../../tecm.htm#a8>. Dafuer, dass das so nuetzliche Funktionen sind, wurden sie ziemlich zeitig in die Browser integriert.

    Calocybe

    1. Hallo Dominique

      Seitens meines Arbeitgebers habe ich recht strenge Vorgaben, also kann ich nicht mir Perl arbeiten und muß bis NS 3.02 abwärtskompatibel sein.

      Oh mann, was ist denn das fuer ein Sklaventreiber?! (nicht wegen NS3, sondern wegen Perl)

      Hehe, das hat schon seinen Sinn. Die wollen zum einen den Servertraffic so niedrig wie möglich halten, weil der schon ziemlich ausgelastet ist, und zum anderen gehts da um die Systemsicherheit (letzteres verstehe ich da nicht ganz).

      Dadurch fallen Sachen wie Url.replace(regExp, teilstring) von vornherein raus.
      Gibt es noch weitere Methoden o.ä., die auch schon ab NS 3.02 verfügbar waren?

      Schau mal nach escape()/unescape() auf <../../tecm.htm#a8>. Dafuer, dass das so nuetzliche Funktionen sind, wurden sie ziemlich zeitig in die Browser integriert.

      Danke für die url aber so wie ich das lese, wandelt escape ein Leerzeichen auf keinen Fall in ein '+' um, sondern in '%20'. Damit kann dann CGI aber nichts anfangen, oder?

      Dominique

      1. Hello again

        Schau mal nach escape()/unescape() auf <../../tecm.htm#a8>. Dafuer, dass das so nuetzliche Funktionen sind, wurden sie ziemlich zeitig in die Browser integriert.

        Danke für die url aber so wie ich das lese, wandelt escape ein Leerzeichen auf keinen Fall in ein '+' um, sondern in '%20'. Damit kann dann CGI aber nichts anfangen, oder?

        Ja stimmt. Normalerweise werden alle Zeichen, die in einer URL nichts zu suchen haben, durch %XX codiert, wobei XX der hexadezimale ASCII-Wert des Zeichens ist. Zusaetzlich darf das Leerzeichen aber auch durch ein + codiert werden. Deshalb ist aber %20 nicht falsch (20hex = 32dec = Leerzeichen). Wenn das CGI-Script nicht voellig stuemperhaft geschrieben ist, sollte es damit zurechtkommen. Man kann auch ein A durch %41 ersetzen (41hex = 65dec). Theoretisch macht das keine Probleme, aber da man es sowieso direkt in der URL angeben darf, sollte man es ruhig tun. (Es gibt zwar keine standardisierte Laengenbegrenzung fuer URLs, aber irgendwo macht ein Webserver trotzdem dicht.)

        Wenn Du jetzt unbedingt das + da drin haben willst, musst Du eine Schleife ueber Deinen String bauen, wo Du dann eben nur die Nicht-Leerzeichen codierst. Eine Funktion, um auf die einzelnen Zeichen zuzgreifen (das ist in JS ziemlich umstaendlich, geht in C viel schoener), findest Du auf <../../tecl.htm#a7>.

        Calocybe

        1. Danke für die url aber so wie ich das lese, wandelt escape ein Leerzeichen auf keinen Fall in ein '+' um, sondern in '%20'. Damit kann dann CGI aber nichts anfangen, oder?

          Ja stimmt. Normalerweise werden alle Zeichen, die in einer URL nichts zu suchen haben, durch %XX codiert, wobei XX der hexadezimale ASCII-Wert des Zeichens ist. Zusaetzlich darf das Leerzeichen aber auch durch ein + codiert werden. Deshalb ist aber %20 nicht falsch (20hex = 32dec = Leerzeichen). Wenn das CGI-Script nicht voellig stuemperhaft geschrieben ist, sollte es damit zurechtkommen. Man kann auch ein A durch %41 ersetzen (41hex = 65dec). Theoretisch macht das keine Probleme, aber da man es sowieso direkt in der URL angeben darf, sollte man es ruhig tun. (Es gibt zwar keine standardisierte Laengenbegrenzung fuer URLs, aber irgendwo macht ein Webserver trotzdem dicht.)

          Wenn Du jetzt unbedingt das + da drin haben willst, musst Du eine Schleife ueber Deinen String bauen, wo Du dann eben nur die Nicht-Leerzeichen codierst. Eine Funktion, um auf die einzelnen Zeichen zuzgreifen (das ist in JS ziemlich umstaendlich, geht in C viel schoener), findest Du auf <../../tecl.htm#a7>.

          Calocybe

          Hallo Dominique, Hallo Calocybe,
          ich find es in JS eigentlich doch nicht sehr umstaendlich, ich hab selbst fuer aehnliche Zwecke schon so was aehnliches codieren muessen und hab kurz mal die Funktion rausgesucht.
          Hier ist sie:
          <CODE>
          function parseCharOff(text, original, copy)
            {
              var rcText = "";
              var lv;
              var lenText = text.length;
              var chr="";
              var org=original.charAt(0);

          if ((original.length != 1) (copy.length != 1))
              {
                  rcText = text + "#NULL#";
                  return rcText;
              }
              for(lv=0;lv < lenText;lv++)
              {
                  chr=text.charAt(lv);
                  if(chr == org)
                  {
                      rcText=rcText + copy;
                  }
                  else
                  {
                      rcText=rcText + chr;
                  }
              }
              return rcText;
          }
          </CODE>
          Noch kurz die Beschreibung:
          Rueckgabewert ist der manipulierte Text, falls man versucht eine Zeichen-Kombination zu ersetzen erhaelt man als Fehlerwert den Originaltext mit dem Anhaengsel "#NULL#" zurueck;
          der Parameter "text" ist natuerlich der Original-Text;
          der Parameter "original" das zu ersetzende Zeichen;
          und der Parameter "copy" das Ersatz-Zeichen.

          Noch viel Spass mit dem Ersetzen von Zeichen.
          Michael N.

          1. Danke für die url aber so wie ich das lese, wandelt escape ein Leerzeichen auf keinen Fall in ein '+' um, sondern in '%20'. Damit kann dann CGI aber nichts anfangen, oder?

            Geht viel schneller (ist aber ein weing unelegant) :

            z = dasistderstringmitspace.split(" ");
            dasistderstringmitplus = z.join("+");

            das funzt ab ns3.0 und ie4.0
            willst du auch noch ie3.0 dann vielleich so: is'n bischen kürzer...:

            var test = "ui ! Schau mal wo die spaces hin sind... Alle weg..."

            function mwech(was,wo,womit) {
            if (wo.length <=0 ) { return "" }
            if (was == wo.substr(0,was.length)) { return womit + mwech(was, wo.substring(was.length,wo.length),womit) }
            else { return  wo.substr(0,1) + mwech(was, wo.substring(1,wo.length),womit) }
            }

            alert (mwech(" ",test,"+"))

            1. join () und split () sind eine geniale Idee. Aber substr() geht laut selfhtml erst ab NS/IE Version 4.
                  Bio

              1. join () und split () sind eine geniale Idee. Aber substr() geht laut selfhtml erst ab NS/IE Version 4.
                    Bio

                ups... das geht natürlich auch mit substring() :-) man muss nur darauf achten das der zweite parameter ein indice ist und keine länge.

                Timo

          2. Hi Michael!

            Jetzt hast Du aber an meinem Stolz gekratzt! ;-) Guck, so geht das in C:

            void xchgchar(char * string, char old, char new) {
                    while (*string)
                        if (*string == old) *string++ = new;
                }
            (Jetzt mal so hingehackt, nicht ueberprueft.)
            Na, was ist jetzt einfacher? ;-) Allerdings laesst sich Deine Funktion auch noch um einiges vereinfachen. Wer braucht schon Fehlerpruefungen? Wer sich nicht sicher ist, ob er die Funktion aufrufen soll, der soll es gefaelligst lassen. Abgesehen davon muesste er in Deinem Fall den Returnwert ja auch noch pruefen, da kann er aber gleich vorher die Fehlerbedingungen ausschliessen.

            Timos Methode hat auch was fuer sich, wenn sie durch die Rekursion auch ziemlich langsam sein duerfte. Vor allem kann man bei ihm nicht nur einzelne Zeichen ersetzen, sondern ganze Zeichenketten. Auch Deine Funktion, Michael, laesst sich leicht dahingehend abaendern. Und das ist das Problem bei C: Das kennt keine Strings, sondern nur Arrays of char, wobei ein char einfach ein Byte ist. Gerade deshalb laesst es sich auf einzelne Zeichen sehr leicht zugreifen, sobald man aber echtes Stringhandling machen will, braucht man erstmal ein paar Zusatzfunktionen, die man schreiben muss. Aber auf einzelne Zeichen kann man eben viel schoener zugreifen, wobei das in der obigen Funktion gar nicht so deutlich ist. Normalerweise macht man das mit string[index]. Als ich mit JS angefangen hatte, bin ich da auch erstmal auf die Schnauze geflogen, weil ich erwartet hatte, dass das da auch geht.

            Calocybe

            1. Hallo Calocybe!

              Jetzt hast Du aber an meinem Stolz gekratzt! ;-) Guck, so geht das in C:

              Das wollt ich nicht.

              void xchgchar(char * string, char old, char new) {
                      while (*string)
                          if (*string == old) *string++ = new;
                  }
              (Jetzt mal so hingehackt, nicht ueberprueft.)

              Muesste eigentlich so funktionieren, hab selber auch schon einige Zeit mit C gearbeitet, mag diese Sprache aber nicht so sehr, da man mit ihr viel zu viele Schweinereien machen kann.

              Wer braucht schon Fehlerpruefungen? Wer sich nicht sicher ist, ob er die Funktion aufrufen soll, der soll es gefaelligst lassen. Abgesehen davon muesste er in Deinem Fall den Returnwert ja auch noch pruefen, da kann er aber gleich vorher die Fehlerbedingungen ausschliessen.

              Du wirst lachen, in Punkto Nutzung von Funktionen habe ich leider schon oft genug erleben muessen, das Bibliotheks-Dokumentationen (und diese Funktion habe ich fuer eine JS-Bibliothek geschrieben) nicht gelesen werden, dann Mist uebergeben wird und sich jeder wundert ueber die Ergebnisse, daher arbeite ich immer mit einem Return-Wert, der auch einen Fehlerindikator hat.

              Timos Methode hat auch was fuer sich, wenn sie durch die Rekursion auch ziemlich langsam sein duerfte.

              Und natuerlich temporaer den Stack heftigst zumuellt und wehe Du hast dann X-Sessions laufen, in denen wiederum X-mal sowas rekursives ablaeuft, dann machts auf irgendeinem Rechner dann garantiert mal BUMM (--> Murphy's Law).

              Vor allem kann man bei ihm nicht nur einzelne Zeichen ersetzen, sondern ganze Zeichenketten. Auch Deine Funktion, Michael, laesst sich leicht dahingehend abaendern. Und das ist das Problem bei C: Das kennt keine Strings, sondern nur Arrays of char, wobei ein char einfach ein Byte ist. Gerade deshalb laesst es sich auf einzelne Zeichen sehr leicht zugreifen, sobald man aber echtes Stringhandling machen will, braucht man erstmal ein paar Zusatzfunktionen, die man schreiben muss. Aber auf einzelne Zeichen kann man eben viel schoener zugreifen, wobei das in der obigen Funktion gar nicht so deutlich ist. Normalerweise macht man das mit string[index].

              Da sprichst Du sicher von ANSI-C, MS-C hat, wenn ich mich recht entsinne, da sowas wie string eingefuehrt, ich hab's nur nie benutzt, da ich von produktgebundenen Sonderfunktionalitaeten jenseits des Standards sehr sehr wenig halte.

              Bis dann
              Michael N.

              1. Hi Michael!

                Jetzt hast Du aber an meinem Stolz gekratzt! ;-) Guck, so geht das in C:
                Das wollt ich nicht.

                War doch nicht so ernst gemeint! :-)

                Muesste eigentlich so funktionieren, hab selber auch schon einige Zeit mit C gearbeitet, mag diese Sprache aber nicht so sehr, da man mit ihr viel zu viele Schweinereien machen kann.

                Das ist ja das geile daran! Ich kann machen was ich will. Nicht so wie in Basic, wo sie es nicht mal geschafft haben, dem Programmierer Pointer zur Verfuegung zu stellen. Natuerlich darf man die Moeglichkeiten nicht zum Erbrechen ausreizen. Ich kann natuerlich einen Pointer durch Type casting in einen int quetschen, nur das macht weder besonders viel Sinn noch hat das irgendwas mit sauberem Programmieren zu tun. Man muss sich schon an ein paar sinnvolle Regeln halten, dann werden die Programme auch nicht dirty. C kennt auch das goto, aber benutzt wird es nur in Ausnahmefaellen.

                Du wirst lachen, in Punkto Nutzung von Funktionen habe ich leider schon oft genug erleben muessen, das Bibliotheks-Dokumentationen (und diese Funktion habe ich fuer eine JS-Bibliothek geschrieben) nicht gelesen werden, dann Mist uebergeben wird und sich jeder wundert ueber die Ergebnisse, daher arbeite ich immer mit einem Return-Wert, der auch einen Fehlerindikator hat.

                Tja, das gehoert auch zum sauberen Programmieren, dass man die Funktionen so verwendet, wie sie gedacht sind und demnach dafuer sorgt, dass die uebergebenen Argumente vernuenftig sind. Wer das nicht schafft, darf sich nicht ueber sinnlose Ergebnisse wundern. Sorry, aber imho sollen diese Leute entweder weiterlernen oder es ganz lassen.

                Und natuerlich temporaer den Stack heftigst zumuellt und wehe Du hast dann X-Sessions laufen, in denen wiederum X-mal sowas rekursives ablaeuft, dann machts auf irgendeinem Rechner dann garantiert mal BUMM (--> Murphy's Law).

                Das gehoert fuer mich auch zur Kunst des Programmierens, dass man sich um solche Probleme wie Ressourcenverschwendung Gedanken macht. In Zeiten von immer groesseren und billigeren RAM-Bausteinen kuemmert sich leider kaum noch jemand um solche Dinge. Die Folge ist, dass manche Sachen auf meiner alten Kiste eben nicht mehr laufen, bzw. sehr langsam (auch wegen fehlender Geschwindigkeitsoptimierung).

                Da sprichst Du sicher von ANSI-C, MS-C hat, wenn ich mich recht entsinne, da sowas wie string eingefuehrt, ich hab's nur nie benutzt, da ich von produktgebundenen Sonderfunktionalitaeten jenseits des Standards sehr sehr wenig halte.

                Zumindest haben die verschiedenen Hersteller haben einen Haufen eigene Funktionen in ihre Bibliotheken gepackt. Einen string-Datentyp kann ich mir fuer C nicht so recht vorstellen (habe nie mit MS-C rumgetan), aber in der Standard C++ Library gibt es glaube ich so eine Klasse (nicht Datentyp). In den MFC (Microsoft Foundation Classes, ziemlich schlechte class library fuer Windows) gibt es auch eine Klasse CString, die ist aber voll auf MFC ausgerichtet und fuer allgemeinere Zwecke voellig unbrauchbar. Vermutlich gibt es auch in anderen Klassenbibliotheken solche String-Klassen. Ich denke, die in Java und JS vorhandene ist ganz gut brauchbar.

                Calocybe

                1. Hallo Calocybe,

                  Wo wir schon mal am driften sind:

                  Das ist ja das geile daran! Ich kann machen was ich will. Nicht so wie in Basic, wo sie es nicht mal geschafft haben, dem Programmierer Pointer zur Verfuegung zu stellen.

                  Da sprichst Du aber nur ueber die heutigen Basic-Versionen, Frueher (Anfang der 80er in den Jahren der PC-Steinzeit mit solchen Prozessoren wie Z80 und 8080 etc.) da gab es in Basic fuer Programmierschweine auf den damaligen PC's mit Basic die Moeglickeit mittels POKE und PEEK ganz schoen heftig zu verpointern, aber diese Sauereien gehen heute nicht mehr (ist auch gut so). Damals musste man hin und wieder durch unsauberes Programmieren den Rechner mmit seinen mageren Ressourcen austricksen, um ueberhaupt etwas zu erreichen (das ist heute nicht mehr noetig).

                  Tja, das gehoert auch zum sauberen Programmieren, dass man die Funktionen so verwendet, wie sie gedacht sind und demnach dafuer sorgt, dass die uebergebenen Argumente vernuenftig sind. Wer das nicht schafft, darf sich nicht ueber sinnlose Ergebnisse wundern. Sorry, aber imho sollen diese Leute entweder weiterlernen oder es ganz lassen.

                  Das ist aber ein Problem, welches wir doch auch hier immer mal wieder beobachten koennen (Ich brauche die eierlegende Wollmilchsau, auf der ich reiten kann, die auch noch meinen Garten verschoenert und mein Haus bewacht und das dann bitte sofort und kostenlos und wenn ihr mir das nicht gebt werde ich unverschaemt.). Und wer liest schon stundenlang Dokus?

                  Zumindest haben die verschiedenen Hersteller haben einen Haufen eigene Funktionen in ihre Bibliotheken gepackt.

                  Aber auch hier wieder der ueblich Mist mit den Eigengewaechsen der Hersteller. Hast Du mit sowas schon mal einen Compilerwechsel durchgemacht, zum weinen. Sauber waere es, wenn eigene Non-Standard-Funktionen ein Praefix mit einem Compiler-Kuerzel haetten und dadurch identifizierbar waeren. Aber was wird gemacht: Compilerhersteller 1 implementiert eine Funktion, nennen wir es FktEins mit einer Schnittstelle; Compilerhersteller 2 implementiert unter dem gleichen Namen eine andere Funktion, mit einer ganz anderen Schnittstelle derselben Breite (eine der ueblichen schlechten Dokus gibt es dann bei beiden gratis dazu) und wann kracht das ganze nicht etwa beim Compile-Vorgang, nein das ganze schmiert mit vollstaendig indifferentem Verhalten an Stellen ab, die nicht auf den eigentlichen Fehler hindeuten. Alles schon passiert, aber wer wechselt schon den Compiler, wenn das Projekt ueber lange Jahre laeuft (In den Augen der Hersteller niemand).

                  [..] (Aber das ist eine ganz andere Diskussion und da habe ich mich wirklich bemueht hoeflich zu bleiben (obwohl ich sowas so kurz nach einer Schliessung ja schon dreist im Quadrat finde).
                  Warst doch auch hoeflich.

                  Jein, wenn ich anfange bewusst hoefliche Formulierungen mit doppeltem Bitte zu waehlen, dann ist das durchaus ein Signal, dass ich doch wesentlich lieber deftiger werden wuerde und das wuerde aber dann wieder jede Eti- und Netiquette sein.

                  Bis dann,
                  Michael

  2. Hi.

    Mit

    var wo = 0;
    var raus =1;
    do
    {
      wo = Deinstring.index.Of(' ',wo);
      if (wo = -1)
       {
        raus = 0;
       }
        else
       {
    Deinstring=Deinstring.substring(0,wo)+'+'+Deinstring.substring(wo+1,Deinstring.length);
       }
    }
    while (raus)

    solltest Du alle Leerzeichen durch '+' ersetzen koennen. Vielleicht hilft es Dir ja (noch) etwas. Funktioniert uebrigens garantiert auch unter Navi und IE 3.
       Bio

  3. Hi.

    Mit

    var wo = 0;
    var raus =1;
    do
    {
      wo = Deinstring.index.Of(' ',wo);
      if (wo = -1)
       {
        raus = 0;
       }
        else
       {
    Deinstring=Deinstring.substring(0,wo)+'+'+Deinstring.substring(wo+1,Deinstring.length);
       }
    }
    while (raus)

    solltest Du alle Leerzeichen durch '+' ersetzen koennen. Vielleicht hilft es Dir ja (noch) etwas. Funktioniert uebrigens garantiert auch unter Navi und IE 3.
       Bio