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
Umut Emin [ Mo, 04 Oktober 2004 21:15 ] [ ID #61141 ]

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.
Uli Honal [ Mo, 04 Oktober 2004 23:01 ] [ ID #61155 ]

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
Umut Emin [ Di, 05 Oktober 2004 00:14 ] [ ID #61164 ]
PHP » de.comp.lang.php.misc » preg_replace - merkwuerdiges Verhalten

Vorheriges Thema: MySQL Tabelle in HTML Tabelle übergeben.
Nächstes Thema: PHP/Win, exec() und ImageMagick/gs Probleme