Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Stringoperationen, die Zweite

Geschrieben von: Stefan Gründhammer
Kategorie: ASP Grundlagen

This printed page brought to you by AlphaSierraPapa

Zur ausgeklügelten Validierung von Formularen ist es fast immer nötig, die Position eines oder mehrerer Zeichen zu kennen. Nehmen wir als Beispiel eine E-Mail-Adresse. Hier möchte man wissen, ob das @-Zeichen vorkommt, und an welcher Stelle. Oder, Sie haben einen String in dem eine bestimmte Zeichenfolge immer wieder vorkommt, diese aber in einem neuen Dokument nicht mehr erscheinen darf - was machen wir da? Natürlich ausschneiden oder durch z.B.: ein Leerzeichen ("") ersetzen.

Bevor wir mit Anwendungsbeispielen starten, möchte ich Ihnen noch eine Liste der Befehle zeigen, mit denen wir uns heute beschäftigen werden:

FunktionBedeutung der Funktion
InStr()Gibt die Position eines Zeichens oder einer Zeichenkette in einem String, beginnend von links, an
InStrRev()Gibt die Position eines Zeichens oder einer Zeichenkette in einem String, beginnend von rechts, an
Len()Gibt die Länge eines Textes zurück
Replace()Ersetzt Textstücke durch andere
Left()Gibt den linken Teil vom Text zurück
Mid()Gibt den mittleren Teil vom String zurück
Right()Gibt den rechten Teil vom Text zurück
Split()Liefert ein nullbasierendes, eindimensionales Array bestehend aus Teilstrings
Join()Bildet einen String aus Teilstrings eines Arrays

Ich habe mir folgende Probleme zur Beschreibung der oben angeführten Funktionen ausgesucht:

Zerschneiden und wieder zusammensetzen von Zeichenketten

Stellen Sie sich einmal vor, Sie haben einen String den Sie an ganz spezifischen Punkten trennen müssen. Leider ist dieser String ziehmlich lang - oder es gibt mehrere zu trennen, was dann? Da Programmierer von Haus aus tippfaul sind, und sich lieber den Kopf darüber zerbrechen "Wie kann ich mir die Arbeit erleichtern, oder gar ersparen", als Sie zu Fuß zu machen, zeige ich Ihnen wie man das macht.

Nehmen wir zum Beispiel die Punkte in einer IP-Adresse als unsere spezifischen Trennzeichen. Ich zeige Ihnen jetzt 2 Möglichkeiten eine IP-Adresse zu trennen und wieder zusammenzusetzen.

Möglichkeit 1

Wenn Sie in einer Datenbank tausende Datensätze haben und sich in jedem eine IP-Adresse befindet dann können Sie durch den Split der IP-Adresse sehr viel an Platz einsparen. Sie können die Zahlenblöcke der IP-Adresse in eigene Felder speichern, und dadurch, daß es sich nun nur noch um Zahlen handelt (welche ein Byte brauchen) werden Sie viel weniger Speicherplatz benötigen als wenn Sie z.B 192.168.3.22 in ein eigenes Textfeld speichern. Die Speicherplatzersparnis beträgt 11 Byte, und das allein ist schon ein guter Grund für diese Prozedur. Und außerdem werden Zahlenfelder von Datenbanken schneller und leichter verwaltet als Textfelder, was wiederum Geschwindigkeit bringt.

Das folgende Beispiel ist splitten.asp.

10: <% Dim strIP, arrIP, strIP2
11: strIP = "192.168.3.22"
12: Response.Write "Die IP-Adresse lautet" & strIP & _
       " und wird mit Split() getrennt" &"<br>"
13: arrIP = Split(strIP,".")
14: Response.Write arrIP(0) & "<br>"
15: Response.Write arrIP(1) & "<br>"
16: Response.Write arrIP(2) & "<br>"
17: Response.Write arrIP(3) & "<br>"
18:
19: Response.Write "Nun werden die Segmente wieder mit der Funktion <i>
                   Join()<i> zusammengefügt.<br>"
20: strIP2 = Join(arrIP,".")
21: Response.Write strIP2 & "<br>"
22: %>

Die Split() Funktion liefert ein nullbasierendes eindimensionales Array zurück in welches die Segmente der Split Funktion gespeichert werden. Durch die Syntax des Split Befehls Split(Ausdruck,Begrenzungszeichen,Zähler,Vergleich) können Sie mit diesem Befehl sehr viel machen.

Hier noch einige Erklärungen zur Syntax: Das Begrenzungszeichen müssen Sie zwischen zwei Anführungszeichen setzen (in unserem Fall "."). Wenn Sie -1 für den Zähler einsetzen, werden alle Teilstrings zurückgeliefert, sollten Sie in Versuchung kommen z.B. 3 einzusetzen werden 3 Teilstrings zurückgegeben. Mit Vergleich können Sie auf binäre Gleichheit (0) oder Textgleichheit (1) vergleichen.

Die Funktion Join(Wert,Begrenzungzeichen) liefert einen String zurück, der aus den Substrings eines Arrays gebildet wird - also das Gegenteil von Split tut. In unserem Fall habe ich die IP-Adresse wieder zusammengesetzt.

Möglichkeit 2

Hier verwende ich nun einen anderen String, um Ihnen die Möglichkeiten der unten beschriebenen Funktionen etwas besser illustrieren zu können. Meistens werden die zerschnitten Strings auch wieder zusammengefügt, sei es nun in der selben Reihenfolge oder einer anderen oder gar mit Füllzeichen (Trennzeichen) wie z.B. einem Leerzeichen. Ich werde Ihnen nun anhand eines kleinen Beispiels (zerschneiden.asp im Download) drei neue Funktionen erklären.

 1: <% @Language = VBScript %>
 2: <% Option Explicit 
 3:  Response.Expires=0 %>
 4:  <html>
 5:  <head>
 6:  <title>zerschneiden.asp</title>
 7:  </head>
 8:  <body>
 9:	<h3>Zerschneiden und wieder zusammensetzen eines Strings</h3>
10:	<p>Zum Zerschneiden eines Strings werden folgende Befehle verwendet:</p>
11:	<p><ul>
12:     <li>Left()</li>
13:     <li>Mid()</li>
14:     <li>Right()</li>
15:     </ul></p>
16:     <p><b>Unser Teststring lautet: <i>ZerschneidenvonStings</i></b></p>
17: <% Dim strText, zer, von, str
18:	strText = "ZerschneidenvonStings"
19:	zer = Left(strText, 12)
20:	von = Mid(strText, 13, 3)
21:	str = Right(strText, 6)
22: %>
23: Das Ergebnis lautet: <% Response.Write zer %> <% = von %> <% = str %>
24: Kuerzer geht das so: <% = zer &" "& von &" "& str %>
25: </body>
26: </html>

Der Befehl Left(strText, 12) in Zeile 19 liefert die ersten 12 Zeichen der Zeichenkette strText von links startend als Stringkopie und schreibt diese aus, bzw. weist sie der Variable "zer" zu. Die Syntax von Left(Zeichenfolge, Länge) ist wiedereinmal sehr leicht.

Mid(strText, 13, 3) in der Zeile 20 liefert eine Kopie von 3 Zeichen beginnend vom 13ten (einschließlich) und schreibt diese entweder aus oder weist diese einer Variable zu. Die Syntax von Mid(Zeichenfolge, Anfang, Länge) ist etwas komplizierter als die von Left(). Mit Anfang geben Sie die Position des Zeichens an, von dem weg eine bestimmte Anzahl an Zeichen (Länge) zurückgeliefert werden soll. Zeichenfolge und Anfang müssen in dieser Funktion gesetzt sein, Länge dagegen ist optional. Wenn Sie bei Länge eine Zahl eingeben die größer ist als die Anzahl an Zeichen vom Anfang (Position von der weg Sie ausschneiden möchten) bis zum Ende der Zeichenfolge, oder Sie Länge nicht angeben, werden alle Zeichen von Anfang bis zum Ende der Zeichenfolge zurückgeliefert (würde dann der Right() Funktion entsprechen).

Der Befehl Right(strText, 6) in Zeile 21 liefert eine Kopie der letzten 6 Zeichen der Zeichenkette und schreibt diese aus. Die Syntax der Right-Funktion ist Right(Zeichenfolge, Länge), und ist somit die selbe wie bei der Left-Funktion.

In Zeile 23 zeige ich die primitivste Art des Ausschreibens und Aneinanderfügens von Strings, und in Zeile 24 die etwas kürzere Version mit Hilfe des "&" Zeichens. Sie können zum Zusammensetzen eines Strings aber auch das "+" Zeichen verwenden, aber Vorsicht "&" und "+" haben grundsätzliche Unterschiede. Wenn Sie das "+" Zeichen verwenden um Strings aneinanderzureihen und in beiden Strings befindet sich ein Zahl, so kommt es zu einer Addition der Zahlen und das ist nicht das was wir wollen. Also verwenden Sie im Zweifelsfall immer das "&" Zeichen. Näheres dazu finden Sie im Artikel Einfache String Operationen.

Suchen von Zeichenketten in Strings

Wenn Sie Eingaben eines Formulars auf ihre Richtigkeit überprüfen kommen Sie nicht um das Suchen von Zeichenketten in Zeichenketten herum. Natürlich ist die Position des gefunden Zeichens auch sehr wichtig. Im nächsten Listing sehen Sie einen Ausschnitt eines einfachen Formularvalidierungsskripts formular.asp. Ich werde hier besonders auf die Funktionen InStrRev() und InStr() eingehen.

45: ' Emailadresse auf Richtigkeit bei der Eingabe pruefen
46: If 6 > Len(strEmailAdresse) Or 0 = Instr(strEmailAdresse,"@") Or _
       0 = InstrRev(strEmailAdresse,".") or _
47:   5 <= (Len(strEmailAdresse) - InstrRev(strEmailAdresse,".")) or _
48:   2 > (Len(strEmailAdresse) - InstrRev(strEmailAdresse,".")) Then
49:   bErfolg = False
50:   strError = strError & "Email Adresse, "
51: End if

In Zeile 46 sehen Sie folgende Funktionen Len(strEmailAdresse), Instr(strEmailAdresse,"@"), InstrRev(strEmailAdresse,"."). Len() wurde bereits im Artikel Einführung in Stringoperationen beschrieben und wird hier nur angeführt. Die Beschreibung der beiden anderen folgt sofort.

Der gesamte Codeblock ist von einer If-Verzweigung eingeschlossen. 0 = Instr(strEmailAdresse,"@") aus der Zeile 46 liefert die Position des Zeichens @ zurück, die Position wird von links ermittelt. Wenn das Zeichen nicht im String vorhanden ist liefert die Funktion 0 zurück, und die Bedingung ist erfüllt und liefert True. Ebenso wie bei der nächsten Funktion: 0 = InstrRev(strEmailAdresse,".") wiederum aus Zeile 46 liefert die Position des ersten Punktes von rechts aus gesehen, die Position wird wieder von links (also absolut) bestimmt. Ist kein Punkt im String dann liefert die Funktion 0. Wären z.B. vier Punkte in einem String liefert InstrRev() die Position des letzten, oder anders gesagt des ersten von rechts. Indem ich InStr() und InStrRev mit 0 vergleiche prüfe ich eigentlich nur auf Vorhandensein des gesuchten Zeichens.

In den Zeilen 47 und 48 bestimme ich die Position des ersten Punktes (von rechts) in der Emailadresse und vergleiche sie. 5 <= (Len(strEmailAdresse) - InstrRev(strEmailAdresse,".")) stellt fest ob die Position des ersten Punktes von rechts größer oder gleich 5 ist. Wenn ja, dann wird True zurückgeliefert. 2 > (Len(strEmailAdresse) - InstrRev(strEmailAdresse,".")) prüft ob der Punkt an letzter oder vorletzter Stelle des Strings ist. Ist dies der Fall, dann liefert die Bedingung True. Bei jedem True in dieser If-Verzweigung wird die Fehlermeldung strError ausgegeben.

Austauschen von Strings

Oft ist es notwendig, Wörter oder Zeichenketten in einer Datenbank oder einem Formular etc. auszutauschen. Auch dafür gibt es eine passende Funktion und diese wäre Replace(). Die Syntax von Replace(Zeichenfolge, SuchString, ErsetzenDurch[,Anfang[,Anzahl[,Vergleich]]]) ist etwas komplexer, die Parameter Zeichenfolge, SuchString und ErsetzenDurch müssen in der Replace-Funktion enthalten sein. Anfang, Anzahl und Vergleich hingegen sind optional.

Erforderliche Parameter

Zeichenfolge hier können Sie direkt einen String eingeben, oder Sie geben einfach die Variable eines Strings ein.
Suchstring das ist jener String, nach dem in der Zeichenfolge gesucht wird.
ErsetzenDurch der neue String.

Optionale Parameter

Anfang gibt die Position in Zeichenfolge an, von der die Suche nach der Teilzeichenfolge beginnen soll
Anzahl hiermit können Sie bestimmen wie oft die Teilzeichenfolge ersetzt werden soll. Wenn Sie nichts angeben werden alle ersetzt. Kann nur in Verbindung mit Anfang eingesetzt werden, und umgekehrt
Vergleich hier können Sie wieder auf binäre Gleichheit oder Textgleichheit prüfen

Mit Replace() können Sie Textstücke bzw. Zeichenketten durch andere ersetzen. Diese Funktion eignet sich zum Beispiel hervorragend um Namen in Serienbriefe einzufügen. Ich habe dazu wieder ein kleines Beispielscript geschrieben, das Sie unter ersetzen.asp im Download finden.

 1: <% @Language = VBScript %>
 2: <% Option Explicit 
 3:  Response.Expires=0 %>
 4:	<html>
 5:	<head>
 6:	<title>ersetzen.asp</title>
 7:	</head>
 8:	<body>
 9:     <h3>Ersetzen eines Strings durch einen anderen</h3>
10:     <p>Zum Ersetzen eines Strings wird die Funktion Replace() verwendet: </p>
11:     <p><b>Unser Teststring lautet: <i>Ersetzen von Stings</i></b></p>
12:     <% Dim strText, zer, von, ersetzt
13:     strText = "Ersetzen von Stings"
14:     ersetzt = Replace(strText, "von", "durch")
15:     %>
16:	<b>Das Ergebnis lautet:<i><% Response.Write ersetzt %></i></b>
17:	</body>
18:	</html>

In diesem Beispiel sehen Sie wie einfach man Strings ersetzen kann. Diese Funktion können Sie auch zum Updaten Ihrer Site nutzen indem Sie den String mittels Formular an das Script übergeben. Auch das ist wieder nur ein kleines Beispiel für diesen mächtigen Befehl.

Sie sollten sich bei der Verwendung der Replace-Funktion über eines im Klaren sein: Replace liefert nicht den geänderten Originalstring, sondern nur den neuen geänderten String zurück. Der orginale bleibt somit erhalten. Wenn Sie aber den Orginalstring geändert haben wollen, dann speichern Sie das Ergebnis einfach in der selben Variable ab.

Die Einsatzmöglichkeiten der Replace-Funktion sind sehr groß. Sie reichen vom entfernen von Leerzeichen oder immer wiederkehrenden Zeichenfolgen bis zum ganz einfachen ersetzen von Zeichen. Eines der wichtigsten Beispiele für das Ersetzen von Zeichen und Zeichenketten kommt aus dem Bereich Datenbanken. Folgende Fehlermeldung ist mit Sicherheit jedem ASP-Programmierer ein Begriff: Syntax error (missing operator) in query expression".

Wenn Sie für das Auslesen, Hinzufügen, Updaten, oder Löschen von Werten einer Datenbank SQL Statements (Structured Query Language) verwenden, dann gibt es einen Fall auf den Sie besonders aufpassen sollten. Ich werden diesen Fall anhand dieses Beispiels erklären:

 1: strDatei = Server.MapPath("/Datenbank.mdb")
 2:
 3: Set conn = Server.CreateObject("ADODB.Connection")
 4: conn.open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
 5:     "Data Source=" & strDatei & ";User ID=admin;Password=;"
 6: Set rs = Server.CreateObject("ADODB.Recordset")
 7: strNachName = "O'Neil"
 8: rs.Open "SELECT * FROM Tabelle1 WHERE Name = '" & strNachName & "'", conn

In Zeile 7 wird der Variable strName der String O'Neil zugewiesen, dieser Name enthält ein Apostroph. Dieses Apostroph ist schuld an der Fehlermeldung. Sehen wir uns das SQL Statement einmal etwas genauer an:

SELECT * FROM Tabelle1 WHERE Name ='O'Neil'

Da der Text 'O'Neil' durch zwei Apostrophe begrenzt wird und der Text selber auch eines enthält ist es für SQL nicht mehr möglich eine zuverlässige Entscheidung zu treffen. Um SQL die Entscheidung abzunehmen muß man zwei Apostrophe in den Text schreiben.

Das korrekte SQL Statement muß dann so aussehen:

SELECT * FROM Tabelle1 WHERE Name ='O''Neil'

Um uns nun die Arbeit etwas zu erleichtern werde ich nun die Replace() Funktion ins Spiel bringen. Um diesen Fehler zu vermeiden sollten Sie das SQL Statement wie folgt verändern.

SELECT * FROM Tabelle1 WHERE Name = '" & Replace(strNachName,"'","''") & "'

Damit Ihnen dieser Fehler nicht mehr unterkommt empfehle ich Ihnen die Replace() Funktion in jedem SQL Statement, in dem Sie Texte dynamisch einfügen.

Schlußbemerkung

Sie haben in diesem Artikel neben vielen anderen die wichtigsten Stringoperationen, wie z.B. die Split(), Join() oder die Replace Funktion kennengelernt. Sie können nun u. a. Strings mit Hilfe der Split Funktion in einzelne Arrays aufteilen oder Strings mit Join() zusammenfügen. Die Replace Funktion erspart Ihnen mühseliges auffinden und ersetzen von Strings.

Diese Anleitung mit praktischen Beispielen sollte Ihren täglichen ASP/VBScript Alltag um einiges vereinfachen.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001020.zip

Verwandte Artikel

Einführung in Stringoperationen
http:/www.aspheute.com/artikel/20001003.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.