Webdesign in Siegen

preg_replace()

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

preg_replace()

Beitragvon Skywalker am 26.07.2008, 22:14

Ich grübel nun schon seit ner geraumen Zeit über folgendem Problem:
Ich will die Werte die aus einer Datenbank kommen, mittels eines Strings filtern.

Soweit ist das auch kein Problem. Jedoch möchte ich nun noch, dass die übereinstimmenden Stellen hervorgehoben werden. Dies wollte ich mit preg_replace() versuchen, bin jedoch am verzweifeln, da immer nur der letzte Treffer in der Zeichenkette hervorgehoben wird. Hier der Code:
Code: Alles auswählen
        while($user = mysql_fetch_array($result)) {
      $pos = stripos($user['name'],$search);
      if($pos !== false) {
         $pattern = '/(.+)('.$search.')(.+)/i';
         $ersetzung = '$1<span style="font-weight:bold">$2</span>$3';
         $user['name'] = preg_replace($pattern, $ersetzung, $user['name']);
         echo '
            <user>
               <ID>'.replaceEntities($user['id']).'</ID>
               <username>'.replaceEntities($user['name']).'</username>
               <IP>'.replaceEntities($user['ip']).'</IP>
               <anwesend>'.replaceEntities($user['online']).'</anwesend>
            </user>
         ';
      }
   }

So wird zum Beispiel für $user['name'] = 'Manuel Mayer' und $search = 'Ma' nur bei Mayer das 'Ma' hervorgehoben. Ich möchte jedoch dass dann beides markiert wird. Ist das möglich? Desweitern gibt es allgemein noch Probleme, denn wenn ich 'Ma' oder 'ma' eingebe, wird nichts hervorgehoben, der Eintrag jedoch gefunden; wenn ich 'an' eingebe, wird dies gefunden und auch hervorgehoben.
Um jegliche Ratschläge wäre ich sehr dankbar :)
Was ist ein ???BildBildBildBild??? auf atomarer Ebene?
Benutzeravatar
Skywalker
Mitglied
 
Beiträge: 68
Registriert: 13.03.2008, 18:05

Re: preg_replace()

Beitragvon Skywalker am 26.07.2008, 22:39

Okay, ich habs teilweise schon selber rausgefunden :D
anstelle von
Code: Alles auswählen
$pattern = '/(.+)('.$search.')(.+)/i';

muss es
Code: Alles auswählen
$pattern = '/(.*)('.$search.')(.*)/i';

sein, da + ja für ein oder mehrere Zeichen steht, und * für keines bis mehrere. Da am Anfang meiner Zeichenkette ja kein anderes Zeichen stehen kann ;)

Jetzt wärs nur noch das Problem mit dem hervorheben der zweimal im String vorkommenden Ergebnissen. Leider gibt es ja kein preg_replace_all() :(
Was ist ein ???BildBildBildBild??? auf atomarer Ebene?
Benutzeravatar
Skywalker
Mitglied
 
Beiträge: 68
Registriert: 13.03.2008, 18:05

Re: preg_replace()

Beitragvon Ingo am 26.07.2008, 23:06

Hi.

Wie sieht's denn aus, wenn du statt $pattern = '/(.*)('.$search.')(.*)/i'; einfach folgendes nimmst:

Code: Alles auswählen
  $pattern = '/('.$search.')/i';
  $ersetzung = '<span style="font-weight:bold">$1</span>';

Oder du setzt in der $1 $2 $3-Variante den Modifikator U ein: $pattern = '/(.*)('.$search.')(.*)/iU';.
Der kehrt die 'Gier' (greediness) der * um.
Die beste Browserweiche ... sitzt zwischen den Ohren ;o]
Benutzeravatar
Ingo
Moderator
 
Beiträge: 724
Registriert: 01.04.2007, 23:21
Wohnort: Neuss/NRW

Re: preg_replace()

Beitragvon Skywalker am 27.07.2008, 14:29

Jo, danke, mit dem Modifikator U funktionierts bestens :)
Was ist ein ???BildBildBildBild??? auf atomarer Ebene?
Benutzeravatar
Skywalker
Mitglied
 
Beiträge: 68
Registriert: 13.03.2008, 18:05


Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste