"Windows"-Suche in PHP?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aalen
allzuviel
antwort
aufsetzer
austausch
beide strings
beispiel
beitrag
buchstabe
fragen
fragestellung
funktion
gel
kenntnis
kleinschreibung
manual
mindestens
quiz
string
zeichenkette
-
Hi, ich programmiere gerade einen Bot f?r IRC in PHP. Um genauer zu sein einen Quiz-Bot... jedoch habe ich ein Problem.
Ich durchsuche die Antwort der User mit der Funktion ereg und dem Suchmuster /Antwort/
Das funktioniert so auch ganz gut. Wenn die Antwort zum Beispiel "M?hre" w?re klappt es, da nach /M*hre/ gesucht wird, anders sieht es aber aus wenn die Antwort "?l" w?re... das hei?t er sucht nach /*l/, was er aber nicht mehr richtig erkennt.
Genau so sieht es aus wenn der * am Ende vom Text steht...
Meine Frage w?re: Wei? jemand wie man das richtig machen kann. Also so zirka wie in Windows gesucht wird. Ein * ersetzt beliebig viele Buchstaben und das aber an jeder Position vom Text und nicht nur in der Mitte...
Vielleicht kann es ja leicht mit ereg gel?st werden, jedoch habe ich davon nicht allzuviel Ahnung ^^
thx schonmal f?r die Infos -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Mit den POSIX-RegEx-Funktionen kenne ich mich nicht aus. Aber du solltest schon aus Geschwindigkeitsgr?nden die PCRE-Funktionen benutzen (ca. 300% schneller als die ereg-Funktionen):
Die entsprechende Suchfunktion lautet preg_match():
http://de.php.net/manual/de/function.preg-match.php
Nun zu deiner Fragestellung:
Beliebig viele Zeichen sucht man in PCRE mit ".*"
Dabei steht der Punkt f?r ein beliebiges Zeichen und das Sternchen f?r eine Zahl von Null bis beliebig viele.
Nach "?l" und Verwandten suchst du so:
'/\A.+l/i'
Dabei steht das "\A" f?r den Anfang des Strings.
Der Punkt wieder f?r ein beliebiges Zeichen.
Das "+" sucht nach mindestens einem oder beliebig vielen Zeichen.
Und das "i" hinter dem Schr?gstrich sorgt daf?r, das "Aal", "?l" ebenso wie "aal" und "?l" gefunden werden -- es unterscheidet also nicht zwischen Gro?- und Kleinschreibung ("case insensitive"). -
hm...
das hei?t wenn die richtige Antwort im String zum Beispiel so gespeichert ist: F*ttern
mache ich einfach preg_match("/\A".strtr($antwort,"*",".*")."/i",$string);
?
Und das klappt dann auch f?r W?rter wie *l,t*r**,hallo oder ?hnliches?
Genau verstanden wof?r \A n?mlich genau ist hab ich n?mlich nicht ^^ -
Das '\A' steht f?r den Anfang einer Zeichenkette in der gesucht werden soll (und falls n?tig, das '\Z' f?r das Ende).
Deinen Quellcode w?rde ich daher eher so formulieren:
preg_match('/\A'.strtr($antwort,'*','.+').'\Z/i',$string);
'.+' "matcht" auf beliebige Zeichen ('.') -- und zwar auf mindestens eins oder beliebig viele ('+')
Benutze f?r den RegEx besser die einfachen Hochkommas, denn sonst k?nnte PHP etwas "hineininterpretieren", was gar nicht hingeh?rt.
-
Wie hie? die Funktion mit der man Zeichen der regul?re Ausdr?cke entwerten kann?
MfG Lucas -
F?r PCRE preg_quote()
http://de.php.net/manual/de/function.preg-quote.php
Ob's das auch f?r ereg-Funktionen gibt, entzieht sich meiner Kenntnis ... -
thx, funktioniert halbwegs so wie es soll ^^
-
hm... also ein Problem hab ich noch...
Ich suche derzeit so: preg_match('/\A'.strtr($regex,'*','.*').'/i',$string)
Das funktioniert auch so halbwegs... jedoch wird f?r einen * immer nur ein Zeichen erlaubt. Es sollen aber von 0 bis beliebig viele Zeichen erlaubt sein...
Also wenn der regex so aussieht nach dem austauschen der Strings: /\AD.*shalb/i
Findet er: Deshalb, Dashalb, Dishalb usw.
Jedoch findet er nicht Deeshalb oder Dshalb usw. -
Das m?sste aber trotzdem gefunden werden, weil ein * f?r letztes Zeichen nicht oder beliebig of hintereinander steht.
Also m?sste bei '/aus*/' 'au', 'aus' und 'aussss' usw. gefunden werden.
Bei '/au.*/' wird dann 'au', 'aus', 'au?en', 'aufsetzer' usw. gefunden. -
... thx, das regex war doch richtig...
Der Fehler war: strtr($regex,'*','.*')
strtr ersetzt nur so viele Zeichen, wie beide Strings gleich lang sind... der Rest wird abgeschnitten. Also der hat nur nen . eingef?gt und nicht .*
Beitrag ge?ndert am 6.05.2006 16:11 von therealkillerinstinkt -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage