(ASM-LIB) PHPString (V0.28)

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

(ASM-LIB) PHPString (V0.28)

Beitrag 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:
Zuletzt geändert von Deeem2031 am 29.08.2005 21:16, insgesamt 19-mal geändert.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

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

Beitrag von Danilo »

Deeem2031 hat geschrieben:String.s = StrTok(String.s, Seperator.s)
Im Prinzip das Gleiche wie StringField(), oder?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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"
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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))
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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:
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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.
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Gerade die könnte ich ja brauchen...
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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())
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

andersrum ergäbe das mehr Sinn :roll:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten