kostenloser Webspace werbefrei: lima-city


"Windows"-Suche in PHP?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    therealkillerinstinkt

    therealkillerinstinkt hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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").
  4. Autor dieses Themas

    therealkillerinstinkt

    therealkillerinstinkt hat kostenlosen Webspace.

    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 ^^
  5. 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.
  6. Wie hie? die Funktion mit der man Zeichen der regul?re Ausdr?cke entwerten kann?

    MfG Lucas
  7. 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 ...
  8. Autor dieses Themas

    therealkillerinstinkt

    therealkillerinstinkt hat kostenlosen Webspace.

    thx, funktioniert halbwegs so wie es soll ^^
  9. Autor dieses Themas

    therealkillerinstinkt

    therealkillerinstinkt hat kostenlosen Webspace.

    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.
  10. 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.
  11. Autor dieses Themas

    therealkillerinstinkt

    therealkillerinstinkt hat kostenlosen Webspace.

    ... 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
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!