Autor | Beitrag |
---|
000 08.10.2010, 21:48 the_Crow |
Ich habe einen recht simplen BBCodeParser in eines meine PHP-Skript integriert, der sonst auch wunderbar funktioniert. Wie der Titel schon sagt, funktioniert der Parser aber nur mit <= 3220 Zeichen. Wenn man mehr als 3220 Zeichen durch den Parser laufen lässt, kommt nur eine leere Seite. Dh es wird auch kein Html ausgegeben (egal an welcher Stelle im File). Das Skript holt sich Text aus einer MySQL-Datenbank, schickt ihn durch den BBCodeParser und gibt den neuen Text aus. Leider gibt es auch keine Fehlermeldung. Nicht im Browser und auch nicht im Logfile am Server. Am Text selbst wird es auch nicht liegen, da ich es bereits mit verschiedenen Texten versucht hab. Ich hoffe einer von euch hat eine Lösung parat.
www.the-crow.at - meine persönliche Website | TibiaGerman | Twitter | Wiaschtlsiada |
Profil || Suche |
001 08.10.2010, 22:52 Prefect |
Wie kommst du darauf, dass das Limit genau 3220 Zeichen sind? Ohne deinen Code wirklich durchgelesen zu haben liegt es irgendwie näher, dass dein Test-Text mit den 3220 Zeichen zufälligerweise eine BB-Code-Kombination enthält die deinen Code verwirren, dass es also nicht an der Länge selbst liegt. Daher: Erstmal verschiedene Inputs durchprobieren und uns dann erklären wie du darauf kommst, dass die Anzahl der Zeichen ein Problem ist. --Widelands - Gemütliche Aufbaustrategie, Free Software |
Profil || Suche |
002 08.10.2010, 23:04 the_Crow |
Abgezählt?
Soll heißen ich hab auch Inputs ohne BBCode versucht. z.B. nur Punkte oder Buchstabensalat. -- www.the-crow.at - meine persönliche Website | TibiaGerman | Twitter | Wiaschtlsiada |
Profil || Suche |
003 09.10.2010, 00:23 Prefect |
Das ist doch schonmal was. Du hast also einen Dummy-Text aus 3220 Punkten versucht und der funktioniert, aber ein Dummy-Text mit 3221 Punkten schlägt fehl? Hast du schonmal ein paar Standard-Debugging-Techniken ausprobiert? Ich würde zum Beispiel mal ausprobieren, an welcher Stelle in deiner Funktion bbcode aus dem Originalstring plötzlich ein leerer String wird. Wenn es in dem preg_replace_callback stattfindet wäre der nächste Schritt ein Sanity-Check: Schau nach, ob bbcode_callback die Argumente bekommt die du erwartest, und ob es die richtige Rückgabe erzeugt. Und so weiter. Ich kenne mich nicht genug mit PHP aus und muss zugeben, dass ich keine Lust habe mich durch fremde Regexes durchzufressen, aber mit diesen Techniken sollte es möglich sein, das Problem schrittweise einzugrenzen, bis du es selbst finden kannst. --Widelands - Gemütliche Aufbaustrategie, Free Software |
Profil || Suche |
004 09.10.2010, 05:05 LeJean |
Hast du mal ne andere Regexp ausprobiert? Wenn du ne einfachere Ersetzung machst, sind die Zeichen dann auch begrenzt? Grad aufgefallen: Warum benutzt du so inkonsistent die Delimiter in deinen RegExes? Mal geschweifte Klammern, dann Slashes, dann eckige Klammern. Und die eckigen Klammern hier Dieser Beitrag wurde am 09.10.2010 um 05:25 von LeJean bearbeitet. |
Profil || Suche |
005 09.10.2010, 09:46 Deathstar |
Nur mal ne frage: timeout? -- |
Profil || Suche |
006 09.10.2010, 10:32 the_Crow |
Immer dann, wenn man mehr als 3220 Zeichen durch den Parser schickt? Den Server kann man auch ausschließen. Habs auf zwei anderen Servern und auf meinem Heimrechner versucht. Selbes Ergebnis. Edit: Edit2: Bis jetzt scheint alles so zu tun wie ich das möchte. --www.the-crow.at - meine persönliche Website | TibiaGerman | Twitter | Wiaschtlsiada Dieser Beitrag wurde am 09.10.2010 um 12:11 von the_Crow bearbeitet. |
Profil || Suche |
007 09.10.2010, 23:44 default |
du ersetzt solange bb tags in jeder zeile - für den gesamten text, bis die ausgabe gleich der eingabe ist? Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst. |
Profil || Suche |
008 10.10.2010, 11:45 default |
manual lesen: Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst. |
Profil || Suche |
009 10.10.2010, 13:22 Chronial |
Die Methode die dort empfohlen wird funktionert aber wohlgemerkt nicht wirklich. Damit geht z.B. sowas: blubblubblub und daraus wird dann invalides html. Wenn die Performance nicht ganz kritisch ist, würde ich die empfehlen, einen preg_match_all mit deinem Pattern laufen zu lassen (mit offset capture aktiviert). Dann hast du ein Array, das nurnoch alle tags (und daran Position) enthält. Darauf kannst du dann arbeiten und auch ziemlich einfach das Zeug im Text ersetzen. Glaube nicht - du bekommst du Probleme, weil ja an sich alles erlaubt ist. Ich vermute mal Grammatiken taugen wenig, um tags aus sonstigem random-text zu fischen. Nach dem Schritt oben kannst du das natürlich Grammatik-Style parsen. -- "tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren Dieser Beitrag wurde am 10.10.2010 um 13:37 von Chronial bearbeitet. |
Profil || Suche |
010 11.10.2010, 00:55 LeJean |
o_O |
Profil || Suche |
011 12.10.2010, 17:14 Chronial |
Grammatiken definieren formale Sprachen. Wie wiki so schön sagt: "eine Teilmenge der Kleeneschen Hülle des Alphabets". Problem ist: unser Alphabet ist UTF8, und unsere Teilmenge ist alles. Wie hilft uns jetzt hier ne Grammatik weiter? -- "tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren Dieser Beitrag wurde am 12.10.2010 um 17:15 von Chronial bearbeitet. |
Profil || Suche |
012 12.10.2010, 18:28 Prefect |
Nur auf der untersten Ebene definieren Grammatiken lediglich eine Teilmenge gültiger Worte ("Wort" hier im bei formalen Sprachen üblichen Sinn). Darüber hinaus kann man eine Grammatik verwenden, um über den Parse-Tree nützliche Informationen zu bekommen. Und ich wette, dass dir das genauso klar ist wie LeJean, nur dass du halt so tust als ob, damit du hier mir ein paar frisch gelernten Fachwörtern den tollen Hengst heraushängen lassen kannst. --Widelands - Gemütliche Aufbaustrategie, Free Software |
Profil || Suche |
013 13.10.2010, 11:20 default |
die argumentation überzeugt: nach der logik kann man ua auch utf8 garnicht parsen, weils kein 7bit ascii ist - macht sinn und erklärt einiges. eine frage habe ich dann aber doch noch, das verwendete pcre, ist das nicht auch eine grammatik die mit utf funktioniert? davon ab, gibt es für php wohl nur einen pg, lime. das ist schwach, aber pal halt. --Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst. Dieser Beitrag wurde am 13.10.2010 um 11:27 von default bearbeitet. |
Profil || Suche |
014 13.10.2010, 11:53 Chronial |
Da liegst du in mehreren Aspekten falsch :). Und was wäre denn deiner Meinung nach die richtige Antwort auf ? Ich habe nicht die geringste Ahnung wovon du redest. Habe ich irgendwo geschrieben, dass utf8 bei der ganzen Angelegenheit ein Problem darstellt? oO Und das es für php lime gibt ändert auch nichts an meiner Ursprünglichen Aussage, die ich gerne nochmal wiederhole: Ich bezweifle stark, dass es für bbcode eine Kontextfreie Grammatik gibt, da es keine Möglichkeit gibt, tags von nicht-tags zu unterscheiden. Wenn man allerdings preg_match_all drüber laufen lässt erhält man ein Array, das man mit einer kontextfreien Grammatik parsen kann. PS: Es war nicht zufällig jemand aus diesem Thread am Thewall BB-Code parser beteiligt? Der Erzeugt nämlich das hier: <b>blub<i>blub</b>blub</i> ^^. *edit: Mir fällt grad ein, dass das natürlich nicht stimmt - du kannst BB-Code nie mit einer Kontextfreien Grammatik parsen, da so ein parser z.B. nie mit Konstrukten wie dem Erwähnten <b>blub<i>blub</b>blub</i> klar kommen wird. --"tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren Dieser Beitrag wurde am 13.10.2010 um 12:06 von Chronial bearbeitet. |
Profil || Suche |
015 13.10.2010, 12:38 default |
darf man das umlenken auf kontextfreie grammatiken als einsicht werten? Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst. |
Profil || Suche |
016 13.10.2010, 20:13 Prefect |
Ja, da hat vermutlich jemand gesagt, aus einfachen Effizienzgründen machen wir da ein stupides Search-Replace statt einer weitergehenden Analyse von Verschachtelung. Deswegen lässt man solche Konstrukte normalerweise in Programmier- und Markup-Sprachen auch nicht zu. Dass der Code hier im Forum sowas erlaubt ist vermutlich ne pragmatische Fallentscheidung gewesen. -- Widelands - Gemütliche Aufbaustrategie, Free Software |
Profil || Suche |
017 14.10.2010, 06:04 default |
Ich denke das Hauptargument ist Benutzerfreundlichkeit, das P in dp steht nämlich für 'Parser', Mangel an * wirds also nicht sein. Wenn man das korrekt machen wollte, müsste man nämlich alle defekten posts zurückweisen, und der Nutzer müsste immer validen bb code posten. Um die Diskussion abzukürzen habe ich da mal was vorbereitet: Aufgabe jetzt ist ein Beispiel was syntaktisch korrekter bbcode ist, nur i und b verwendet, nicht geparsed werden kann, und kein lamer Bug ist. --Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst. |
Profil || Suche |
018 14.10.2010, 11:14 the_Crow |
Was hab ich da mit meiner Frage nur ausgelöst ^^ --www.the-crow.at - meine persönliche Website | TibiaGerman | Twitter | Wiaschtlsiada |
Profil || Suche |
019 18.10.2010, 13:14 LeJean |
Danke default. Der Übersichtlichkeit halber die Produktionsregeln von default, die validen BB-Code mit b und i schön sauber auflösen. Das Alphabet ist übrigens nur die Menge der Terminalsymbole, und die entsprechen nicht 1:1 dem UTF8-Satz. Unten ist "TEXT" z.B. ein Terminalsymbol und kann aus beliebig vielen Textzeichen bestehen, genauso ist BOLD_OPEN das Terminalsymbol, dessen textuelle Repräsentation "[b]" ist.
Dieser Beitrag wurde am 18.10.2010 um 13:24 von LeJean bearbeitet. |
Profil || Suche |