preg_replace - merkwuerdiges Verhalten
Hallo Zusammen,
mein Zweck ist:
"a" , "an" , "is" ,"und", "ist" Wörter aus einem eingegebenen Satz
herauszufiltern.Beispiel:
Eingabe: bla und blubber a a aa an anan aus
Ausgabe: bla blubber aa anan aus
dafuer benutze ich:
#Diese Woerter werden herausgefiltert und nicht gesucht.
$verbWoerter="(and)|(with)|(or)|(ist?)|(are)|(an?)|(through) |(und)|(mit)|(oder)|(sind)|(durch)"
;
$replace = " " ;
#Alle verbotenen sind nach reggy heRausgefiltert.
$reggy =
"/(\s$verbWoerter\s)+/" ;
return preg_replace($reggy,$replace,$searchQuery) ;
Aber anders als erwartet, kriege ich als Ergebnis fuer die obige Eingabe:
Ergebnis: bl blubber us
Sieht der preg_replace \s nicht? Wieso frisst er den " aa " weg, obwohl
er nicht dem Regex passt? Und schliesslich wieso nimmt er
unverschaemterweise ein a von "aus"(oder auch von "bla") weg?
Gruss.
Umut
Re: preg_replace - merkwuerdiges Verhalten
Umut Emin wrote:
> [...] Wörter aus einem eingegebenen Satz
> herauszufiltern.Beispiel:
>
> Eingabe: bla und blubber a a aa an anan aus
> Ausgabe: bla blubber aa anan aus
> $verbWoerter=3D"(and)|(with)|(or)|(ist?)|(are)|(an?)|(throug h)|(und)|(m=
it)|(oder)|(sind)|(durch)"
> $reggy =3D "/(\s$verbWoerter\s)+/";
> return preg_replace($reggy,'',$searchQuery) ;
> Aber anders als erwartet, kriege ich als Ergebnis fuer die obige Eingab=
e:
>
> Ergebnis: bl blubber us
Deine fertige Expression sieht ja etwa so aus:
"/(\s(and)|(with)|(or)| ..."
Der erste |-Operator verknüpft also "\s(and)" mit "(with)", und so
weiter...
Richtig wäre:
$verbWoerter=3D"(and|with|or| ... )";
Die restlichen Klammern sind überflüssig.
BTW: Je nach Situation ist vielleicht eher \b statt \s angebracht..
cheers,
-Uli.
Re: preg_replace - merkwuerdiges Verhalten (solved)
Uli Honal schrieb:
> Umut Emin wrote:
>
>> [...] Wörter aus einem eingegebenen Satz herauszufiltern.Beispiel:
>>
>> Eingabe: bla und blubber a a aa an anan aus
>> Ausgabe: bla blubber aa anan aus
>> [code]
>> Aber anders als erwartet, kriege ich als Ergebnis fuer die obige Eingabe:
>>
>> Ergebnis: bl blubber us
> Deine fertige Expression sieht ja etwa so aus:
>
> "/(\s(and)|(with)|(or)| ..."
Ja, koennte man auch machen. Aber für den Fall dass eins von deisen
Wörtern ganz am Anfang oder ganz am Ende kommt, wird das Wort durch
deine reggy nicht herausgefiltert... ;) Deswegen hab ick "/\s.*\s/"
nicht benutzt.
z.B:
^and here comes the Elvis$ V ^this could be an a$
>
> Der erste |-Operator verknüpft also "\s(and)" mit "(with)", und so
> weiter...
>
> Richtig wäre:
> $verbWoerter="(and|with|or| ... )";
>
> Die restlichen Klammern sind überflüssig.
Haste recht.. Ich war mir halt nicht sicher.In Perl würde ich sicherlich
so schreiben wie du.. ich bin etwa bei PHP vorsichtiger.
>
>
> BTW: Je nach Situation ist vielleicht eher \b statt \s angebracht.
ja, die loesung für den fall, was optimal funktioniert, ist:
$reggy = "/(\b($verbWoerter\b)[\s]+)+/" ;
Nach vielen Versuche, denke ich mir, dass Perl's regex maschine ist
deutlich einfacher als die PHPs...
>
>
> cheers,
>
> -Uli
> .
Cheers back,
Umut