Seite 1 von 1

C#/Java: Smilies in string ersetzen

Verfasst: 27.08.2004, 14:34
von Smoerble
Hoi Leuts...
Es geht um ein Mini-CMS. Ich habe eine ganze Menge mögl. Smilie-Codes (Sachen a la: :smile:, : ), :o), :jerking: etc etc), die in einer eigenen Tabelle in der DB abgespeichert sind (natzürlich mit ejweiliger URL f. das Icon), in etwa:

Code: Alles auswählen

ID   smilieCode     smilieURL
1   :jerkin:      /images/icons/smiliejerkin.gif

Jetzt möchte ich in einem String alle entsprechenden smilieCodes mit entsprechenden imageTags ersetzen.

Einfachste Methode (Achtung, nur prinzipieller Pseudo-Code):

Code: Alles auswählen

returnString = "...hsdkjd :) akshdkas :) asjkdhaks :jerkin:sajkhgdajk..."

DataTable resultSet = helperDatabase.getResult("holMirAlleSmiliesAusDerDB")
foreach (DataRow dtRow in resultSet.Rows) {
   returnString = returnString.Replace(dtRow["smilieCode"], dtRow["smilieURL"]);
}
Das ist aber natürlich extrem lahm, wenn man z.B. 300 Icons so ersetzen will. Daher meine Frage:
Wie würdet Ihr das am schnellsten und/oder wie am elegantesten lösen?

Danke
Smo[/code]

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 27.08.2004, 15:06
von HW
..es gibt wie immer viele Möglichkeiten.
Zum einen kannst Du das ja diesmal wirklich per Regex auflösen.

Aber vielleicht ist ein anderer Weg noch eleganter.
Speichere doch deine Smilies in span-tags
Beispiel: <span class="hsdkjd"></span>

Dann kannst Du die 1:1 aus einer Datenbank auslesen und die Smilies über eine CSS-Datei setzen in dem Du einfach der Klasse eine feste Größe und ein Background-Image mit gibst.

Verfasst: 27.08.2004, 15:09
von Smoerble
klingt gut...
für smilies ist das so direkt nicht hilfreich, da User ja die Standard-Smilie-Codes aus anderen Foren benutzen, aber dann kann ich ja ein regEx laufen lassen, dass die smilies findet und durch passende span's ersetzt (wo ist der mickey hin? :D).
Die Idee, das über ein einmal zu generierendes CSS zu lösen finde ich aber wirklich gut.

Verfasst: 27.08.2004, 15:16
von HW
Übrigens:
Eine gute Basis für Regex findest Du hier:
https://www.regxlib.com/

Verfasst: 30.08.2004, 23:02
von mickey
also da ich nicht mal genau weiss, was du da machst, kann ich natürlich keine besonder passende antwort geben.

hier aber dennoch ein paar denkanstöße:
wieso machst du eine schleife über alle möglichen smilies? es könnte ja sein, das nur einige oder gar keines im text enthalten sind?! es ist bestimmt sinnvoller, erst mal alle smilies im text zu suchen (zb mit regex) und dann gezielt zu ersetzen.

aber ich glaube, das in deinem fall die lösung mit css bestimmt viel einfacher und zweckgebunder ist ;-)

Verfasst: 31.08.2004, 12:00
von Smoerble
Ok, nochmal zur Verdeutlichung:
Es gibt ein ziemlich grosses Set an Icons (u.a. Smilies), die ein User einsetzen kann. Diese werden immer als eine Art Platzhalter gesetzt:
:smileA: oder :smile25: oder :r_o_f_l: oder sonstwas...
Natürlich ist deren Name nicht fix, da ständig neue hinzukommen oder wegfallen.

Daher ist obige Lösung, die fix mit einem CSS zu ersetzen keine richtige Lösung (ist mir inzwischen aufgefallen), da ich ja trotzdem erst durch die DB laufen müsste um alle passenden Ersetzungen zu finden:

aus :smileA: wird

Code: Alles auswählen

<span class="smileA"></span>
Aber dann muss ich ein entsprechendes CSS File generieren, dass alle smilies beinhaltet, was ich natürlich nihct möchte.

Somit wären wir doch bei dem Vorschlag von mickey:
Alle smilies finden, eine SQLquery, die nur genau diese smilies holt und dann entsprechend ersetzen.


Frage 1:
Idee: alle Smilies zu holen und in einer static Variablen namens resultSet zu cachen, dann über alle smilies zu loopen und nur jeweils einen Filter über das resultSet zu setzen. Pseudo-Code:

Code: Alles auswählen

String myString = "loooong string with smilies ;&#41;";
regExResult = regularExpression&#40;finde alle smilies im string&#41;;

Static DataTable resultSet;
… check, if resultSet is cached, if not&#58;
     resultSet = helperSQL&#40;holmirallesmilies&#41;;
...
For each smilie in regExResult &#123;
   resultSet.Select&#40;"getRowWhereSmilieIs"+smilie.getValue…&#41;;
   myString = myString.Replace&#40;smilie.getValue…, "<img src='"+resultSet&#91;"smilieImageURL"&#93;+"'>"&#41;;
&#125;
Findet Ihr, das macht Sinn? Hat jemand eine Idee, wie man das mit besserer Perfomance lösen könnte?



Frage 1:
Die Zeile

Code: Alles auswählen

   myString = myString.Replace&#40;smilie.getValue…, "<img src='"+resultSet&#91;"smilieImageURL"&#93;+"'>"&#41;;
Ist hier der Bottleneck, also wirklich extrem lahm, wenn 'mal 200+ Icons ersetzt werden müssen.
Im Notfall kann ich statt einem string einen StringBuilder nehmen, trotzdem:
Könnte man das sinnvoll/effektiver in ein RegEx pflanzen? Ich glaube nicht, aber villeicht hat ja sonst jemand eine Idee?


Danke
Michael

Verfasst: 31.08.2004, 14:34
von stalker
verzichte doch einfach auf die db und speicher die smilies zB in einem array und ersetze alles vor dem db insert
ist von der performance auf jedenfall der variante das bei dem seitenaufruf zu erledigen überlegen

Verfasst: 31.08.2004, 14:39
von Smoerble
sowas ist auch extrem unpraktisch:
wenn später ein icon ausgetauscht wird, würden alte <img> tags noch auf eine nicht existierende grafik zeigen.

wird ja auch nicht bei jedem seitenaufruf, sondern nur beim ersten einmal gebraucht, ab da arbeitet man ja sowieso mit cache.