Problem mit Regulären Ausdrücken

Alles, was PHP betrifft, kann hier besprochen werden.

Problem mit Regulären Ausdrücken

Postby Knight1 » 12. May 2008 13:57

Hi AF-Com,
ich habe da ein Problem.
In dem Gästebuch welches ich für mein aktuelles Projekt geschrieben habe, habe ich mir auch eine Zensor-Funktion eingebaut.
Ausserdem gibt es die Möglichkeit Smilies in den Text einzufügen.
Es gibt keine Möglichkeit BB(-ähnlichen)-Code zu verwenden.
Aus diesem Grund habe in den Zensor folgende Zeichen zum austausch eingetragen:

[ -> & #91;
] -> & #93;

Die klammern werden also in ihre HTML-Entsprechung umgewandelt.

Für das Einbinden der Smilies nutze ich aber folgende Syntax

[smilie:ID]

wobei ID die Datensatz-ID des Smilies in der Datenbank ist.

Der Zensor wandelt logischerweise alle Klammer um, unabhängig von deren Zughörigkeit.

Jetzt habe ich mir folgenden Regulären Ausdruck ausgedacht:

Code: Select all
$gb['text'] = preg_replace("/& #91;smilie\:[0-9]{+}& #93;/siU","[smilie:$1]",$gb['text']);


Der Funktioniert aber nicht. Es kommt auch keinerlei Fehlermeldungen.
Error-Level steht auf E_ALL | E_STRICT
Es werden einfach die HTML-Entsprechungen an den entsprechenden Stellen nicht wieder in die Klammern zurück "verwandelt".

Ich blicke nicht durch.

Bitte helft mir.

Danke schon im vorraus.


Kai aka Knight1
Last edited by Knight1 on 12. May 2008 15:52, edited 1 time in total.
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Wiedmann » 12. May 2008 14:43

Code: Select all
$gb['text'] = preg_replace("/[smilie\:[0-9]{+}]/siU","[smilie:$1]",$gb['text']);

IMHO dürfte die Regex so eh nicht passen... Aber mal was Grundlegendes:
Diese Umwandlung von "[" -> "& #91;" findet vor oder nach diesem preg_replace statt? Bzw., was gibt z.B. ein "var_dump($gb['text']);" vor dieser Zeile aus?
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Knight1 » 12. May 2008 15:07

Wiedmann wrote:
Code: Select all
$gb['text'] = preg_replace("/[smilie\:[0-9]{+}]/siU","[smilie:$1]",$gb['text']);

IMHO dürfte die Regex so eh nicht passen... Aber mal was Grundlegendes:
Diese Umwandlung von "[" -> "& #91;" findet vor oder nach diesem preg_replace statt? Bzw., was gibt z.B. ein "var_dump($gb['text']);" vor dieser Zeile aus?


So sieht der Abschnitt mit Zensor und Smilies aus:
Code: Select all
   if ($GLOBALS['config']['gb_zensor_active'] == "1")
   {
   $zensor_query = $GLOBALS['mysqli']->query("SELECT * FROM `".MYSQL_TABLE_GUESTBOOK_ZENSOR."` WHERE `active` = '1'");
   $GLOBALS['logs']->mysql_messages($GLOBALS['mysqli']->errno,$GLOBALS['mysqli']->error,__FILE__,bcsub(__LINE__,1,0),NULL);
    while ($zensor = $zensor_query->fetch_array(MYSQL_ASSOC))
    {
    $gb['text'] = str_replace($zensor['suchwort'],$zensor['ersetzungswort'],$gb['text']);
    }
   $gb['text'] = preg_replace("/& #91;smilie\:[0-9& #93;{+}]/siU","[smilie:$1]",$gb['text']);
   }
   if ($GLOBALS['config']['gb_smilies_active'] == "1")   { $gb['text'] = $GLOBALS['common']->smilies($gb['text'],NULL,NULL); }


Das ist die Smilies-Umwandlungs-Funktion innerhalb der common-Klasse:
Code: Select all
 function smilies ($text,$path,$newsletter)
 {
 $smilies_query = $GLOBALS['mysqli']->query("SELECT * FROM `".MYSQL_TABLE_SMILIES."` WHERE `active` = '1'");
 $GLOBALS['logs']->mysql_messages($GLOBALS['mysqli']->errno,$GLOBALS['mysqli']->error,__FILE__,bcsub(__LINE__,1,0),$path);
 $newsletter_string = "";
  if ($newsletter == "1")
  {
  $newsletter_string = "&newsletter=true";
  }
  while ($smilies = $smilies_query->fetch_array(MYSQL_ASSOC))
  {
  $GLOBALS['logs']->mysql_messages($GLOBALS['mysqli']->errno,$GLOBALS['mysqli']->error,__FILE__,bcsub(__LINE__,2,0),$path);
  $text = str_replace("[smilie:{$smilies['id']}]","<img src="http://{$GLOBALS['config']['homepageadress']}/show_images.php?what=smilie&smilie_id={$smilies['id']}{$newsletter_string}" alt="{$smilies['id']}: {$smilies['file_name']}" border="0">",$text);
  }
 RETURN $text;
 }


Bis auf den preg_replace Funktioniert auch alles. Der Zensor wandelt de Eckigen Klammer in ihre HTML-Entsprechung um nur der preg_replace halt nicht wieder zurück wenn diese zum Smilie gehören.

Deaktiviere ich die beiden Einträge für Klammern in der Datenbank, greift der Zensor auch nicht und die Smilies werden normal umgewandelt.

Aktiviere ich sie wieder steht die HTML-Entsprechung im Quelltext.

Der var_dump direkt nach dem Auslesen des Gästebucheintrags aus der Datenbank bringt wie zu erwarten die korrekten Klammern.

Die Umwandlung erfolgt ja auch erst unmittelbar vor der Ausgabe an den Browser.



Kai aka Knight1
Last edited by Knight1 on 12. May 2008 15:53, edited 1 time in total.
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Wiedmann » 12. May 2008 15:48

Code: Select all
    while ($zensor = $zensor_query->fetch_array(MYSQL_ASSOC))
    {
    $gb['text'] = str_replace($zensor['suchwort'],$zensor['ersetzungswort'],$gb['text']);
    }
   $gb['text'] = preg_replace("/[smilie\:[0-9]{+}]/siU","[smilie:$1]",$gb['text']);
   }

Also wird erst "[" mit "& #91;" ersetzt, und dann kommt der preg_replace. Der preg_replace darf hier dann natürlich nicht nach "[smilie" suchen, sondern muss nach "& #91;smilie" suchen (wurde ja schon ersetzt).
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Knight1 » 12. May 2008 15:56

Wiedmann wrote:
Code: Select all
    while ($zensor = $zensor_query->fetch_array(MYSQL_ASSOC))
    {
    $gb['text'] = str_replace($zensor['suchwort'],$zensor['ersetzungswort'],$gb['text']);
    }
   $gb['text'] = preg_replace("/[smilie\:[0-9]{+}]/siU","[smilie:$1]",$gb['text']);
   }

Also wird erst "[" mit "& #91;" ersetzt, und dann kommt der preg_replace. Der preg_replace darf hier dann natürlich nicht nach "[smilie" suchen, sondern muss nach "& #91;smilie" suchen (wurde ja schon ersetzt).


Sorry,
war ein Eingabefehler von mir. Ich hatte vergessen ein Leerzeichen zu setzen damit der Browser die HTML-Entsprechungen nicht umwandelt.
Habe es geändert.
Natürlich sucht preg_replace nach & #91; und & #93;
Natürlich ohne die Leerzeichen.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Wiedmann » 12. May 2008 16:16

war ein Eingabefehler von mir. Ich hatte vergessen ein Leerzeichen zu setzen damit der Browser die HTML-Entsprechungen nicht umwandelt.

Ok, das hat mich gerade auch schon geärgert ;-)

Code: Select all
$gb['text'] = preg_replace("/[smilie\:[0-9]{+}]/siU","[smilie:$1]",$gb['text']);

Versuch mal damit:
Code: Select all
$gb['text'] = preg_replace('/& #91;smilie:(\\d+)& #93;/i', '[smilie:\\1]', $gb['text']);

(die Leerzeichen natürlich rausmachen ;-) )
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Knight1 » 12. May 2008 16:24

Ok,
Deine Lösung funktioniert.

Allerdings verstehe den Unterschied zwischen meinem [0-9]{+} und Deinem (\\d+) nicht.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Wiedmann » 12. May 2008 16:33

Allerdings verstehe den Unterschied zwischen meinem [0-9]{+} und Deinem (\\d+) nicht.

Naja, "{+}" ist so oder so falsch. Entweder "+" oder "{1,}". Ansonsten ist "\d+" kürzer für das Selbe ;-)


Allerdings:
Wenn du in replace die backreference $1 benutzt, musst du sie auch erzeugen "()".
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Knight1 » 12. May 2008 16:40

Ich hatte es auch schon mal mit [0-9+] probiert.
Immer hatte als Ausgabe weiterehin & #91;smilie:ID& #93; (natürlich ohne leerzeichen) im Quelltext stehen. Wobei ID für ID-Nummer des Datensatzes steht.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Wiedmann » 12. May 2008 16:47

Ich hatte es auch schon mal mit [0-9+] probiert.

([0-9]+)
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Knight1 » 12. May 2008 16:59

DANKE Wiedmann für Deine Hilfe.
Jetzt habe ich es so wie ich es die ganze Zeit wollte. Und es funktioniert.

Hier:

Code: Select all
$gb['text'] = preg_replace("/& #91;smilie:([0-9]+)& #93;/i","[smilie:$1]",$gb['text']);



Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Nobbie » 12. May 2008 18:40

Was ich insgesamt daran nicht verstehe, wieso tauschst Du überhaupt die eckigen Klammern gegen die HTML-Codes aus? Was bringt das (außer Arbeit und Performance verbraten)?
Nobbie
 
Posts: 8775
Joined: 09. March 2008 13:04

Postby Knight1 » 13. May 2008 11:11

Weil ich bei dem Gästebuch sowohl BB-Code (ausser die Smlie-Tags) als auch HTML-Code verhindern will.

Selbst wenn ich die Klammern in diesem System wieder aus dem Zensor herausnehmen sollte ist es nicht sicher dass sie später in einer anderen Installation wieder herein kommen.

So bin ich auf der sicheren Seite dass die Smilies korrekt umgewandelt werden, egal was irgendwann mal in dem Zensor stehen sollte oder auch nicht.


Kai aka Knight
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Nobbie » 13. May 2008 11:17

Knight1 wrote:Weil ich bei dem Gästebuch sowohl BB-Code (ausser die Smlie-Tags) als auch HTML-Code verhindern will.


HTML - das ist klar - aber wieso willst Du BB-Code "verhindern"? Der wird doch sowieso nicht vom Browser interpretiert - Deine Umsetzung in HTML Entities bringt gar nichts - außer Probleme.

Deswegen frage ich, ich kann keinen Sinn entdecken.
Nobbie
 
Posts: 8775
Joined: 09. March 2008 13:04

Postby Knight1 » 13. May 2008 11:28

Nobbie wrote:... Der wird doch sowieso nicht vom Browser interpretiert - Deine Umsetzung in HTML Entities bringt gar nichts - außer Probleme. ...


Klar, BB-Code Umwandlung ist reine PHP-Script-Angelegenheit. War vielleicht etwas ungeschickt ausgedrückt.

Mir ging es ja auch Hauptsächlich da drum dass wenn die Eckigen Klammern [ ] in den Zensor eingetragen werden, werden die Smilie-Tags zerschossen. Das wollte ich verhindern.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Next

Return to PHP

Who is online

Users browsing this forum: No registered users and 1 guest