You are not logged in.

wcf.regNote.message

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

1

Monday, May 18th 2009, 6:59pm

Mein Message Parser klappt nicht wie er soll - preg_match_all unbrauchbar für mein Vorhaben?

Ich bin dabei eine Funktion zu schreiben um in einer Textarea irgendwas zu schreiben und die Nachricht dann durch den Parser geschickt auszugeben. Kurz zur Erklärung was ich machen möchte.

Beispiel:

Quoted

Hallo [ b ]Max[ / b ],
schau mal [ u ]hier[ / u ], wie toll das bild aussieht

[ ascii ]Ein Ascii Art Bild irgendwo her[ / ascii ]
oder wie findest du [ u ]das[ / u ] Bild?

[ ascii]noch ein Ascii Bild[ / ascii]

So, diese Nachricht soll nun so durch meine Funktion laufen, dass die Passagen wo [ ascii ] und [ / ascii ] vorkommen erst mal aus der Nachricht ausgesondert werden und dann der rest der Nachricht entsprechend mit den Schriftformatierungen umgewandelt werden. Das heißt [ b ] für fett, [ u ] für unterstrichen und [ i ] für kursiv. Die Funktion hab ich auch schon geschrieben, allerdings erstens klappt das ganze nur für das erste Vorkommen. Das heißt wird in dem Text zwei mal etwas fett gemacht klappt es schon nicht weil ich mit preg_match nur das erste Vorkommen finde und dann umbauen lasse und außerdem jetzt wo ich angefangen hab auch noch Smilies zu erkennen geht es ganz los da ein Ascii Bild nicht mit Smilies versehen werden soll.

Hier mal die Funktion

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
function messageparser($message)
{
    // Ascii Art ermöglichen
    if(preg_match("/\[ascii\]/"$message) && preg_match("/\[\/ascii\]/"$message))
    {
        $tmp1 preg_split("/\[ascii\]/"$message);
        $tmp2 preg_split("/\[\/ascii\]/"$tmp1['1']);
        $asciimessage str_replace(" "," ",$tmp2['0']);
        $message_beforeascii $tmp1['0']."<span class=\"asciifont\">";
        $message_afterascii "</span>".$tmp2['1'];
        $message $message_beforeascii.$asciimessage.$message_afterascii;
    }
    // Fett schreiben
    if(preg_match("/\[b\]/"$message) && preg_match("/\[\/b\]/"$message))
    {
        $tmp1 preg_split("/\[b\]/"$message);
        if(preg_match("/^\[b\]/"$message)) $tmp2 preg_split("/\[\/b\]/"$tmp1['1']);
        else $tmp2 preg_split("/\[\/b\]/"$tmp1['1']);
        $messageb $tmp2['0'];
        $message_beforeb $tmp1['0']."<b>";
        $message_afterb "</b>".$tmp2['1'];
        $message $message_beforeb.$messageb.$message_afterb;
    }
    // Kursiv schreiben
    if(preg_match("/\[i\]/"$message) && preg_match("/\[\/i\]/"$message))
    {
        $tmp1 preg_split("/\[i\]/"$message);
        if(preg_match("/^\[i\]/"$message)) $tmp2 preg_split("/\[\/i\]/"$tmp1['1']);
        else $tmp2 preg_split("/\[\/i\]/"$tmp1['1']);
        $messagei $tmp2['0'];
        $message_beforei $tmp1['0']."<i>";
        $message_afteri "</i>".$tmp2['1'];
        $message $message_beforei.$messagei.$message_afteri;
    }
    // Unterstrichen schreiben
    if(preg_match("/\[u\]/"$message) && preg_match("/\[\/u\]/"$message))
    {
        $tmp1 preg_split("/\[u\]/"$message);
        if(preg_match("/^\[u\]/"$message)) $tmp2 preg_split("/\[\/u\]/"$tmp1['1']);
        else $tmp2 preg_split("/\[\/u\]/"$tmp1['1']);
        $messageu $tmp2['0'];
        $message_beforeu $tmp1['0']."<u>";
        $message_afteru "</u>".$tmp2['1'];
        $message $message_beforeu.$messageu.$message_afteru;
    }
    if(preg_match("/\:\)/"$message))
    {
        $tmp1 preg_split("/\:\)/"$message);
        $message_before_smile $tmp1['0']."<img src=\"images/smilies/smile.png\" border=\"0\" />";
        $message_after_smile $tmp1['1'];
        $message $message_before_smile.$message_after_smile;
    }
    if(preg_match("/\:D/"$message))
    {
        $tmp1 preg_split("/\:D/"$message);
        $message_before_smile $tmp1['0']."<img src=\"images/smilies/biggrin.png\" border=\"0\" />";
        $message_after_smile $tmp1['1'];
        $message $message_before_smile.$message_after_smile;
    }
    if(preg_match("/\;\)/"$message))
    {
        $tmp1 preg_split("/\;\)/"$message);
        $message_before_smile $tmp1['0']."<img src=\"images/smilies/wink.png\" border=\"0\" />";
        $message_after_smile $tmp1['1'];
        $message $message_before_smile.$message_after_smile;
    }
    return $message;
}

Ich hab auch schon ein wenig weiter gemacht und mit preg_match_all rum experimentiert und so aber irgendwie is das alles nix. Das klappt einfach nicht so wie es soll.

Hat jemand da noch eine Idee wie ich da weiter kommen könnte?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Rumpel78

Beginner

Posts: 27

  • Send private message

2

Wednesday, May 20th 2009, 3:27pm

Da ich auch schon eigene Tags in das Burning Board eingepflegt habe (Einen KB-Parser für OGame), kann ich dir da vielleicht behilflich sein.

1. Ersetzen von BB-Tags mit HTML-Codes geht direkt über preg_replace, (gute Anleitungen gibt es einige im Internet, z.B. http://www.tutorials.de/forum/php-tutori…ions-regex.html ), das geht soweit ich weiss auch über mehrere Vorkommen. Für einfache sachen wie Fett oder Kursive Schreibweisen ist das die richtige Wahl.
2. Soll der Inhalt eines Bereichs nicht verarbeitet werden (Wie z.B. bei der ASCII-Grafik) Ersetzt du den Bereich durch ein Token (z.b. __ASCII_01___ ), speicherst den Inhalt der Tags in einen Buffer und lässt erst dann die einfachen Ersetzungen laufen (die von Punkt 1).
3. Jetzt werden die Buffer geparst.
4. Zu guter letzt werden die Tokens mit den Werten aus dem Buffer ersetzt.

Aber schau die doch mal die Parser von dem Forum an? Ich kenn jetzt zwar nur die Klassen vom WBB2, aber das war eigentlich recht gut verständlich.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

3

Wednesday, May 20th 2009, 3:38pm

Nun ja, ich bin ein großer Freund davon mir alles selbst zu erarbeiten. Das heißt ich überlege mir irgendwas was ich im Web gerne umsetzen möchte und schaue mir dann an welche Befehle mir in dem Fall PHP zur Verfügung stellt und schreibe dann einfach eine Funktion welche ich im Kopf habe und bei der ich denke so könnte es gehen. Das heißt mein erster Gedanke war ich muss in dem Text die Stelle finden wo [ascii] steht und muss dann das Ende [/ascii] finden und dann muss ich genau an diesen Stellen z.B. einfach <font face="Courier"> und </font> einsetzen damit ich eine Konstantschriftart erhalte. Daraufhin habe ich gemerkt stop, die Leerzeichen welche bei Ascii Art ja nötig sind werden entfernt und das Bild klebt am linken Rand. Also muss ich Leerzeichen erfassen und ersetze diese in &nbsp; welche ja bei der Ausgabe nicht entfernt werden. Tja und so wachen meine Funktionen und immer neue Ideen kommen dazu.

Lange Rede kurzer Sinn. Wenn ich mir jetzt den Parser vom WBB oder auch jeder anderen beliebigen Software anschaue kann ich genau so gut gleich TinyMCE oder wie die Editoren heißen nehmen und damit mein Gästebuch umsetzen. Ich lege sehr großen Wert darauf das speziell bei diesem einen Projekt nachher 100% des ganzen meinem eigenen Können entspringt. Kann sein das ich das alles in 5 Jahren mal lösche weil es nicht ankommt aber kann auch sein das ich in 5 Jahren 100 Entwickler habe die daran mit arbeiten und egal welcher Fall eintritt möchte ich nie in die Situation geraten, dass jemand meint ich würde sein Eigentum verwenden und müsste jetzt das und das zahlen oder wäre ihm das und das schuldig oder sonst was. Alles was dort ist gehört einzig und alleine mir und da bin ich bis jetzt auch stolz drauf auch wenn es eigentlich noch nicht viel ist mit knapp 15000 Code Zeilen.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

wcf.user.socialbookmarks.titel