Problem mit regulärem Ausdruck
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
aufgefallen
aufrufen
code
ersetzen
fragezeichen
funktion
http
klammern
manual
methode
sandrock
schauen
schleifen
sparen
suche
tabelle
text
vorkommen
zeichen
-
Hallo,
ich habe ein Problem mit einem regulären Ausdruck, der in meinem Forum bestimmte Zeichenketten durch Bilder (Smileys) ersetzen soll.
Die Zeichenfolgen
Semikolon_Minus_Klammer-zu und
Semikolon_Klammer-zu
sollen durch ein Bild ersetzt werden. Leider wird auch die Zeichenfolge:
Anführungszeichen_Klammer-zu
ersetzt, wobei die Anführungszeichen stehen bleiben und nur die Klammer ersetzt wird.
Hier mal der Code:
<?php $text = \'bla bla bla (\"bla\") bla\'; echo preg_replace(\'/;-?\\)/i\',\'<img src=\"...\" alt=\"...\" />\',$text); ?>
Ausgegeben wird:
bla bla bla (\"bla\"<img src=\"...\" alt=\"...\" /> bla
Wie diese komische Ausgabe zustande kommt, weiß ich nicht, denn alle anderen Zeichenfolgen, die nur eine Klammer-zu enthalten, werden nicht ersetzt.
Wo liegt der Fehler? Ich bin ehrlich gesagt ziemlich ratlos.
Beitrag geändert: 1.1.2008 12:26:52 von sandrock-jonas -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Huch. Wieso nimmst du nicht einfach str_replace()? ist doch sonst die übliche Methode?
-
Hallo deine Regex stimmt einfach nicht.
Die Klammern sind Grupierungssymbole in einer Regex d.h. du mußt Klammern als Zeichen escapen. Und das Fragezeichen gehört da auch nicht hin.
ein Smiley hat also die Regex: \'/;-\\)/i\'
So funktioniert es zum Bsp.:
<?php $text = \'bla bla ;-) bla (\"bla\") bla\'; echo preg_replace(\'/;-\\)/i\', \'<img src=\"...\" alt=\"...\" />\', $text); ?>
Grüßle
PS: ansonsten halt ne PM -
benutzernaemelchen schrieb:
Huch. Wieso nimmst du nicht einfach str_replace()? ist doch sonst die übliche Methode?
Weil ich mir mit regulären Ausdrücken Schleifen sparen kann und verschiedene Zeichenfolgen auf einmal ersetzen kann (hier: Semikolon_Minus_Klammer-zu und Semikolon_Klammer-zu). Dazu müsste ich mehrfach str_replace aufrufen. Aber wenn ich keine Lösung mit regulären Ausdrücken hinbekomme, muss ich wohl auf str_replace zurückgreifen.
scout schrieb:
Die Klammern sind Grupierungssymbole in einer Regex d.h. du mußt Klammern als Zeichen escapen. Und das Fragezeichen gehört da auch nicht hin.
1. Die Klammer hab ich escaped. Allerdings hat Lima den Backslash weggemacht, genau wie bei deinem Code. Ist mir nur beim Durchlesen meines Beitrags nicht aufgefallen.
2. Ein Fragezeichen in einem Regex bedeutet, dass das Zeichen davor vorkommen darf, aber nicht muss. Es sollen schließlich sowohl die Zeichenfolge Semikolon_Minus_Klammer-zu als auch die Zeichenfolge Semikolon_Klammer-zu gefunden werden. -
benutzernaemelchen schrieb:
Huch. Wieso nimmst du nicht einfach str_replace()? ist doch sonst die übliche Methode?
Weil ich mir mit regulären Ausdrücken Schleifen sparen kann und verschiedene Zeichenfolgen auf einmal ersetzen kann (hier: Semikolon_Minus_Klammer-zu und Semikolon_Klammer-zu). Dazu müsste ich mehrfach str_replace aufrufen. Aber wenn ich keine Lösung mit regulären Ausdrücken hinbekomme, muss ich wohl auf str_replace zurückgreifen.
Du kannst die verschiedenen Kombinationen der Smileys doch einfach in ein Array schreiben...
<?php function parsesmileys($text) { $suche = array( \':D\', \':biggrin:\', \'???\' ); $ersetze = array( \' \', \' \', \' \' ); $text = str_replace($suche, $ersetze, $text); return $text; } ?>
Beitrag geändert: 1.1.2008 18:53:44 von sesch -
1. Die Klammer hab ich escaped. Allerdings hat Lima den Backslash weggemacht, genau wie bei deinem Code. Ist mir nur beim Durchlesen meines Beitrags nicht aufgefallen.
Ok, wenn du es escaped hast, funktioniert es bei mir wunderbar.
2. Ein Fragezeichen in einem Regex bedeutet, dass das Zeichen davor vorkommen darf, aber nicht muss. Es sollen schließlich sowohl die Zeichenfolge Semikolon_Minus_Klammer-zu als auch die Zeichenfolge Semikolon_Klammer-zu gefunden werden.
weiß ich - hab dich da nur falsch verstanden gehabt sorry.
Also wie gesagt, dein geposteter Quelltext funktioniert soweit bei mir. Hast du evtl. ein UTF-8 Input und versuchst das Ersetzen ohne die Multibyte Funktionen? ...ansonsten mal hier schauen: http://de.php.net/manual/de/function.mb-ereg-replace.php
Grüßle -
scout schrieb:Also wie gesagt, dein geposteter Quelltext funktioniert soweit bei mir. Hast du evtl. ein UTF-8 Input und versuchst das Ersetzen ohne die Multibyte Funktionen? ...ansonsten mal hier schauen: http://de.php.net/manual/de/function.mb-ereg-replace.php
Stimmt, der Quelltext funktioniert. Den habe ich als Beispiel hingeschrieben und nicht weiter ausprobiert.
In meinem Forum funktioniert das so:
Ein User gibt einen Text ein. Dieser wird so, wie er ist, in einer MySQL-Tabelle gespeichert. Wenn dann jemand den Thread ansehen will, wird der Text aus der Tabelle ausgelesen, in HTML-Code verwandelt und unter anderem die Smilieys ersetzt. Ist das dann UTF-8? Mit diesen Kodierungen kenne ich mich leider nicht aus. Auch der Einsatz von mb_ereg_replace() hat nicht geholfen.
edit
Der Fehler lag wo ganz anders. Der reguläre Ausdruck ist richtig, aber vorher wurden durch die Funktion htmlentities() angewandt und somit die Anführungszeichen durch & quot; ersetzt, was am Ende ein Semikolon enthält. Bei dieser Funktion habe ich nun die Option ENT_NOQUOTES gesetzt. So funktionierts.
Beitrag geändert: 2.1.2008 15:22:00 von sandrock-jonas -
Anstatt ENT_NOQOUTES zu nutzen würde ich ganz einfach ein Leerzeichen vor und hinter einem Smilie verlangen.
Ist auf der anderen Seite auch für den Leser angenehmer. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage