Seite 1 von 4

(ASM-LIB) PHPString (V0.28)

Verfasst: 26.04.2005 00:40
von Deeem2031
Ich hab vor paar Stunden eine Lib angefangen, die später möglichst alle Stringbefehle die PHP hat, in PB nutzbar macht.

Download:
http://www.deeem2031.de/PHPString
Mit "PHP" Präfix (z.B. PHPStrPos() ):
http://www.deeem2031.de/PHPString_Praefix
(in .../Purebasic/PureLibraries/Userlibraries kopieren)

Befehle: (Für die PHP-Hilfe auf den Befehl klicken)

StrLen.l(string.s) - gibt die Länge des Strings zurück

SubStr.s(string.s,start[,len]) - "verbessertes Mid"

StrPos.l(String.s, SuchString.s [, StartPosition]) - Im Prinzip das selbe wie FindString, nur das FindString mit 1 anfängt, StrPos aber mit 0

StrTok.s(String.s, Seperator.s) oder StrTok.s(Seperator.s) - Zerlegt den String

Ord.l(char.s) - Das selbe wie Asc()

StrRepeat.s(String.s,multiplier.l) - Wiederholt den String (heißt eigentlich in PHP Str_Repeat, aber der PBCompiler mag den Unterstrich nicht)

Count_Chars.l(string.s) bzw. Count_CharsS.s(string.s,mode.l) - Zählt die einzelnen Zeichen des Strings (von Purefan)

Implode.s(Seperator.s,Array) - Fügt alle Elemente des Arrays zu einem String zusammen

Join.s(Seperator.s,Array) - Fügt alle Elemente des Arrays zu einem String zusammen (das selbe wie Implode)

StrRot13.s(String.s) - "Verschlüsselt" einen String in dem alle Buchstaben um 13 Zeichen im Alphabet verschoben werden.

AddCSlashes.s(String.s,Charlist.s) - Schützt die Zeichen der Charlist im String mit einem Backslash (\)

AddSlashes.s(String.s) - Schützt die Zeichen " ' \ mit einem Backslash (\) (Das Nullbyte zu schützen würde wohl kaum Sinn machen)

StrStr.s(String.s, SuchString.s) - Ähnlich wie StrPos, nur das nicht die Position sondern der String ab der Position zurückgegeben wird.

UCFirst.s(String.s) - Ändert den ersten Buchstaben zu einem Großbuchstaben.

Explode.array(Seperator.s,String.s) - Teilt den String auf und gibt die einzelnen Teile in einem Array zurück.

StrRev.s(String.s) - Dreht die Zeichenkette um.

StrRPos.l(haystack.s, (char) needle.s) - Sucht ein Zeichen (needle) in einem String (haystack) und fängt dabei am Ende des Strings an. (Die erste Pos. des String ist 1, auch wenn das bei PHP nicht so ist)

ChunkSplit.s(string.s [, chunklen [, end.s]]) - Teilt den String durch "end"s auseinander (#CRLF wenn nicht angegeben), wobei jedes Teil "chunklen" lang ist (76 wenn nicht angegeben)

StrChr.s(String.s, SuchString.s) - Ähnlich wie StrPos, nur das nicht die Position sondern der String ab der Position zurückgegeben wird. (Das selbe wie StrStr())

StrRChr.s(string haystack, string needle) - Sucht ein Zeichen (needle) in einem String (haystack) und fängt dabei am Ende des Strings an. Gibt den Rest (+needle) des Strings zurück.

StrTr.s(string str, string from, string to) - Ersetzt die Zeichen aus "from" durch die Zeichen aus "to". D.h. das erste Zeichen aus "from" mit dem ersten aus "to" und das zweite Zeichen aus "from" mit dem zweiten aus "to" ...

StrCSpn.l(string str1, string str2) - Durchsucht "str1" nach den Zeichen aus "str2" und gibt die Position zurück wenn eine Übereinstimmung gefunden wurde. (beginnend bei 1)

StrSpn.l(string str1, string str2) - Durchsucht "str1" nach den Zeichen aus "str2" und gibt die Position zurück wenn keine Übereinstimmung gefunden wurde. (beginnend bei 1)

BeipielCode

Code: Alles auswählen

Debug "SubStr"
Debug "1.) " + SubStr("1234567", 2)
Debug "2.) " + SubStr("1234567", 2, 4)
Debug "3.) " + SubStr("1234567", 0, 7)
Debug "4.) " + SubStr("1234567", -2)
Debug "5.) " + SubStr("1234567", -2, 3)
Debug "6.) " + SubStr("1234567", 4, -4)
Debug "7.) " + SubStr("1234567", 2, -1)
Debug "8.) " + SubStr("1234567", -6, -5)
Debug "9.) " + SubStr("1234567", -12, 3)
Debug ""

Debug "StrTok"
Debug "1.) " + StrTok("abcdefgabcdefg","cd")
Debug "2.) " + StrTok("f")
Debug "3.) " + StrTok("b")
Debug "4.) " + StrTok("ef")
Debug "5.) " + StrTok("x")
Debug "1.) " + StrTok("a|b|c|d","|")
Debug "2.) " + StrTok("|")
Debug "3.) " + StrTok("|")
Debug "4.) " + StrTok("|")
Debug ""

Debug "StrLen"
Debug "1.) " + Str(StrLen("abcdefgabcdefg"))
Debug "2.) " + Str(StrLen(""))
Debug ""

Debug "StrPos"
Debug "1.) " + Str(StrPos("abcdefgabcdefg","x"))
Debug "2.) " + Str(StrPos("abcdefgabcdefg","a",6))
Debug "3.) " + Str(StrPos("abcdefgabcdefg","bc"))
Debug "4.) " + Str(StrPos("abcdefgabcdefg","gh",0))
Debug ""

Debug "StrRepeat"
Debug "1.) " + StrRepeat("a",1)
Debug "2.) " + StrRepeat("a",10)
Debug "3.) " + StrRepeat("a",3)
Debug ""

Debug "Ord"
Debug "1.) " + Str(Ord("A")) + " = " + Str(Asc("A"))
Debug ""

Debug "Count_Chars"
Structure Count_Chars
  Char.w[256]
EndStructure

; mode 0 (array)
*a.Count_Chars=CountChars("Kreide fressen, das lohnt sich!")
For i=0 To 255
  If *a\Char[i]
    Debug Str(*a\Char[i])+ " x CHR("+Str(i)+") = "+Chr(i)
  EndIf
Next i

; mode 3 (string)
Debug CountCharsS("Er frisst alle auf und nur",3)

; mode 4 (string)
a.s=""
For i=1 To 255
  If i<'A' Or i>'Z'
    a+Chr(i)
  EndIf
Next i
Debug CountCharsS(a,4)
Debug ""

Debug "Implode / Join"
Dim Array.s(1)

Array(0) = "abc"
Array(1) = "xyz"
Debug Implode("|",Array())
Debug Join("|",Array())
Debug ""

Debug "Str_rot13"
Debug StrRot13("SELFPHP 5")
Debug StrRot13(StrRot13("SELFPHP 5"))
Debug ""

Debug "AddCSlashes"
Debug AddCSlashes("SELFPHP 5","EP")
Debug ""

Debug "AddSlashes"
Debug AddSlashes("\-'-"+#DQUOTE$+" ...")
Debug ""

Debug "StrStr / StrChr"
Debug StrStr("abcdefgabcdefg","x")
Debug StrStr("abcdefgabcdefg","bc")
Debug StrChr("abcdefgabcdefg","x")
Debug StrChr("abcdefgabcdefg","bc")
Debug ""

Debug "UCFirst"
Debug UCFirst("abcdef")
Debug ""

Debug "Explode"
Dim E_Array.s(0)
FreeArray(E_Array())
E_Array() = Explode("a","bac")

For i = 0 To CountArray(E_Array())-1
  Debug E_Array(i)
Next
Debug ""

Debug "StrRev"
Debug StrRev("abcdefghijklmnopqrstuvwxyz")
Debug ""

Debug "ChunkSplit"
a.s = Space(1000)
a = ReplaceString(a," ","a")
Debug ReplaceString(ChunkSplit(a),#CRLF$,"bc")
Debug ReplaceString(ChunkSplit(a,1),#CRLF$,"bc")
Debug ChunkSplit(a,1,"ef")
Debug ""

Debug "StrRPos"
Debug StrRPos("abcabc","b")
Debug StrRPos("abcabc","d")
Debug ""

Debug "StrRChr"
Debug StrRChr("abcabc","b")
Debug StrRChr("abcabc","d")
Debug ""

Debug "StrTr"
Debug StrTr("abcabc","a","f")
Debug ""

Debug "StrCSpn"
Debug StrCSpn("StrCSpn","ABC")
Debug ""

Debug "StrSpn"
Debug StrSpn("StrSpn","rtS")
Debug StrSpn("StrSpn","")
Wäre über Feedback erfreut. Bei meinen ASM-Codes bin ich mir nämlich nicht immer sicher obs auch bugfrei ist, aber ich hab die Procs vorher natürlich auch Lecks getestet. :wink:

Re: (ASM-LIB) PHPString (V0.10)

Verfasst: 26.04.2005 07:06
von Danilo
Deeem2031 hat geschrieben:String.s = StrTok(String.s, Seperator.s)
Im Prinzip das Gleiche wie StringField(), oder?

Verfasst: 26.04.2005 11:07
von Deeem2031
Nicht ganz, man kann die Seperatoren zwischendurch ändern.
Also z.B.:

Code: Alles auswählen

Debug StrTok("abcdef","b")
Debug StrTok("e")
Dadurch bekommt man alles zwischen dem ersten "b" und dem ersten "e" nach dem "b" also in dem Bsp. "cd"

Verfasst: 01.05.2005 15:52
von Deeem2031
Der Seperator bei StrTok() muss übrigens nicht ein Zeichen lang sein, so wie bei StringField().

Und hier ist dann auch schon die nächste Version 0.11:

Link ist der selbe: http://www.deeem2031.de/PHPString

Neue Befehle: StrLen(string.s) und SubStr(string.s,start[,len])

StrLen() ist zwar das selbe wie das Len() von PB, brauch aber dank PureFans Hilfe nur ungefähr 2/3 der Zeit :)

SubStr() ist eine Art Mid() wobei SubStr() aber auch negative Werte verarbeitet. Schreibt man SubStr("abc",-1) wird vom Ende des Strings eins zurück gezählt und von dort alle zeichen bis zum Ende ausgegeben. Mit SubStr() kann man also auch Left(string.s,a) (=SubStr(string.s,0,a)) und Right(string.s,a) (=SubStr(string.s,-a)) ersetzen.
Gibt man bei der Länge einen negativen Wert an, wird der String vom Start bis zur Position Länge+(-Len) zurückgegeben.
Allerdings ist SubStr() noch nicht ganz fertig, bei Werten die über die Länge des Strings hinausragen kann es passieren das fälsche Werte zurückgegeben werden. Das werde ich aber noch beheben.

Beispiel: (Beim 9. von SubStr wird der Bug mit zu großen Werten deutlich)

Code: Alles auswählen

Debug "SubStr (beta)"
Debug "1.) " + SubStr("1234567", 2)
Debug "2.) " + SubStr("1234567", 2, 4)
Debug "3.) " + SubStr("1234567", 0, 7)
Debug "4.) " + SubStr("1234567", -2)
Debug "5.) " + SubStr("1234567", -2, 3)
Debug "6.) " + SubStr("1234567", 4, -4)
Debug "7.) " + SubStr("1234567", 2, -1)
Debug "8.) " + SubStr("1234567", -6, -5)
Debug "9.) " + SubStr("1234567", -12, 3)
Debug ""
Debug "StrTok"
Debug "1.) " + StrTok("abcdefgabcdefg","cd")
Debug "2.) " + StrTok("e")
Debug "3.) " + StrTok("x")
Debug "4.) " + StrTok("b")
Debug "5.) " + StrTok("efg")
Debug ""
Debug "StrLen"
Debug "1.) " + Str(StrLen("abcdefgabcdefg"))
Debug "2.) " + Str(StrLen(""))
Debug ""
Debug "StrPos"
Debug "1.) " + Str(StrPos("abcdefgabcdefg","x"))
Debug "2.) " + Str(StrPos("abcdefgabcdefg","a",1))
Debug "3.) " + Str(StrPos("abcdefgabcdefg","bc"))
Debug "4.) " + Str(StrPos("abcdefgabcdefg","gh",0))

Verfasst: 01.05.2005 22:46
von bluejoke
whow, das wird mal voll geil.
Wenn dann irgendwann der volle PHP-Befehlssatz implementiert ist (nicht nur die Stringbefehle) :D dann würd ich auch was dafür zahlen... :allright:

Verfasst: 01.05.2005 23:29
von zigapeda
Inline PHP. wäre echt geil wenn die ganzen php befehle funktinieren auser auf ein paar die sich speziell auf das internet beziehen.

Verfasst: 02.05.2005 15:47
von bluejoke
Gerade die könnte ich ja brauchen...

Verfasst: 10.05.2005 00:16
von Deeem2031
Da das Forum schonwieder seinen Standort wechseln durfte und der Beitrag nichtmehr existiert, hier nochmal die Veränderungen für Version 0.20:

Link:
http://www.deeem2031.de/PHPString
Mit "PHP" Präfix (z.B. PHPStrPos() ):
http://www.deeem2031.de/PHPString_Praefix

Neue Befehle:
Ord.l(char.s) - Das selbe wie Asc()
StrRepeat.s(String.s,multiplier.l) - Wiederholt den String (heißt eigentlich in PHP Str_Repeat, aber der PBCompiler mag den Unterstrich nicht)
Count_Chars.l(string.s) bzw. Count_CharsS.s(string.s,mode.l) - Zählt die einzelnen Zeichen des Strings (von Purefan)
Implode.s(Seperator.s,Array) - Fügt alle Elemente des Arrays zu einem String zusammen

Repariert:
StrTok(Seperator.s) - Wenn der Sep. nicht gefunden wird, wird der Rest des Strings zurückgegeben.
SubStr() - Funktioniert jetzt auch mit ungültigen "start" und "len" Angaben

Optimiert:
StrPos
; geschwindigkeit bei 10000000x 220byte string
; PB = 5782
; NEU = 2687
SubStr, StrTok ;Nicht gemessen

Beispiel:

Code: Alles auswählen

Debug "SubStr"
Debug "1.) " + SubStr("1234567", 2)
Debug "2.) " + SubStr("1234567", 2, 4)
Debug "3.) " + SubStr("1234567", 0, 7)
Debug "4.) " + SubStr("1234567", -2)
Debug "5.) " + SubStr("1234567", -2, 3)
Debug "6.) " + SubStr("1234567", 4, -4)
Debug "7.) " + SubStr("1234567", 2, -1)
Debug "8.) " + SubStr("1234567", -6, -5)
Debug "9.) " + SubStr("1234567", -12, 3)
Debug ""

Debug "StrTok"
Debug "1.) " + StrTok("abcdefgabcdefg","cd")
Debug "2.) " + StrTok("f")
Debug "3.) " + StrTok("b")
Debug "4.) " + StrTok("ef")
Debug "5.) " + StrTok("x")
Debug "1.) " + StrTok("a|b|c|d","|")
Debug "2.) " + StrTok("|")
Debug "3.) " + StrTok("|")
Debug "4.) " + StrTok("|")
Debug ""

Debug "StrLen"
Debug "1.) " + Str(StrLen("abcdefgabcdefg"))
Debug "2.) " + Str(StrLen(""))
Debug ""

Debug "StrPos"
Debug "1.) " + Str(StrPos("abcdefgabcdefg","x"))
Debug "2.) " + Str(StrPos("abcdefgabcdefg","a",6))
Debug "3.) " + Str(StrPos("abcdefgabcdefg","bc"))
Debug "4.) " + Str(StrPos("abcdefgabcdefg","gh",0))
Debug ""

Debug "StrRepeat"
Debug "1.) " + StrRepeat("a",1)
Debug "2.) " + StrRepeat("a",10)
Debug "3.) " + StrRepeat("a",3)
Debug ""

Debug "Ord"
Debug "1.) " + Str(Ord("A")) + " = " + Str(Asc("A"))
Debug ""

Debug "Count_Chars"
Structure Count_Chars
  Char.w[256]
EndStructure

; mode 0 (array)
*a.Count_Chars=Count_Chars("Kreide fressen, das lohnt sich!")
For i=0 To 255
  If *a\Char[i]
    Debug Str(*a\Char[i])+ " x CHR("+Str(i)+") = "+Chr(i)
  EndIf
Next i

; mode 3 (string)
Debug Count_CharsS("Er frisst alle auf und nur",3)

; mode 4 (string)
a.s=""
For i=1 To 255
  If i<'A' Or i>'Z'
    a+Chr(i)
  EndIf
Next i
Debug Count_CharsS(a,4)
Debug ""

Debug "Implode"
Dim Array.s(1)

Array(0) = "abc"
Array(1) = "xyz"
Debug Implode("|",Array())

Verfasst: 13.05.2005 15:07
von Deeem2031
Version 0.21:

Neue Befehle:

Join.s(Seperator.s,Array) - Fügt alle Elemente des Arrays zu einem String zusammen (das selbe wie Implode)

StrRot13.s(String.s) - "Verschlüsselt" einen String in dem alle Buchstaben um 13 Zeichen im Alphabet verschoben werden.

AddCSlashes.s(String.s,Charlist.s) - Schützt die Zeichen der Charlist im String mit einem Backslash (\)

Optimiert:
StrLen (schonwieder :) )
;10000000*50 Zeichen:
;Len: 1125 ms
;StrLen: 406 ms

StrLen braucht also nichtmal mehr die Hälfte der Zeit die PB braucht.

Verfasst: 13.05.2005 15:32
von bobobo
andersrum ergäbe das mehr Sinn :roll: