Hi Ansgar,
super, dass das funktioniert hat.
Das zweite ist allerdings kein Bug, da müsstet Ihr schon selbst auf möglicherweise überlappende Smiliecodes aufpassen. Smilies werden ja recht direkt interpretiert, denn sie werden ja vom User relativ "willkürlich" verwendet. Es gibt also nicht wirklich ganz eindeutige Start- und Endzeichen (wie z.B. bei einem BBCode) die man als Richtwert nehmen könnte. Als Smiliecode kannst Du ja im Grunde alles einstellen was Du möchtest. Diese Smiliecodes werden dann nicht einzeln, sondern als Ganzes bzw. Gruppe interpretiert, sodass eben nicht zu viele Schleifen bei der Erkennung von Smilies und neuerdings eben auch Emojicodes über einen Post laufen müssen. Gerade die Anzahl an Emojicodes ist ja auch nochmal eine riesen Latte die im Hintergrund durch Emojione hinzugefügt wird. Das alles in einer Schleife zu erkennen und mit dem längsten möglichen zu beginnen wäre natürlich richtig übel für die Geschwindigkeit.
Wenn da ein Smiliecode einen anderen überlappt nimmt preg_match natürlich das was er als erstes zu erkennen scheint. Er wüsste ja auch wenn zwei Codes möglich wären nicht, für was er sich dann im Endeffekt entscheiden sollte. Eben weil Smiliecodes auch recht willkürlich definiert sein können.
Bei den Codes selbst musst Du also ein bisschen aufpassen, damit diese auch eindeutig sind. Als mögliche Lösung könntest Du Textcodes von Smilies ja immer z.B. mit 2 Doppelpunkten beginnen, dann kann es mit den paar "kurz-Smilies" nicht überlappen.
Übrigens innerhalb von Beiträgen ist der Algorithmus für Smilies schon recht schlau, er erkennt nämlich auch, wie die Smiliecodes verwendet werden. Also wenn ich einen Smiliecode innerhalb eines Wortes verwenden würde wie z.B. "Test:Dwort" also sprich: "Test
:Dwort", dann würde er da keinen
draus machen. Diesen ersetzt er nur, wenn er getrennt bzw. am Zeilenende oder blank innerhalb eines BBCodes usw. steht. Nur bei den Codes selbst für die Erkennung dürfen natürlich keine Parallelen vorhanden sein, er nimmt natürlich immer das erste was kommt wenn es grundlegend als möglicher Smiliekandidat erkannt wird. In Deinem Fall wird daher der längere Code auch als Smiliekandidat gefunden (ist ja ein Smiliecode) aber dann wird die erste Ersetzung (:D) drauf angewendet, weil Du eine Überlappung in Deinen Codes hast.
LG,
Chris