Portal > Foren > PHP > PHP-Programmierung > BBCode "noparse"
Antwort
 
Themen-Optionen
Alt 19.10.2007, 14:44 Nach oben    #1
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.212
Standard BBCode "noparse"

Ich bastle gerade ein wenig mit BBCode herum.

Nun kommt mir die Frage:
Wie geht das mit dem noparse-tag?

Der kann ja auch hier im Forum benutzt werden und sorgt dafür, dass das was von ihm eingeschlossen wird nicht als BBCode interpretiert wird.

Wie kann man sowas realisieren?

einfach das noparse sowie das End-Stück und die darin eingeschlossenen tags durch was anderes ersetzen und am Ende wieder zurücktauschen?

Hat jemand Ideen dazu?
Anmerkung der Projektleitung

Aus dieser Fragestellung entstand ein Tutorial:
[php] BBCode-Parser mit [noparse]-Tag selbst gemacht
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!

Geändert von Jann Hendrik (29.04.2008 um 08:12 Uhr).
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.10.2007, 15:13 Nach oben    #2
Jonas
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 240
Standard

Ich würde die erste Methode anwenden, da sie erstens leicht zu realisieren ist und zweitens vermeidet, dass der BBCode-Parser zu viel machen muss und das im NOPARSE mit parst.
__________________
Applikations-Programmierung:
BlitzMax, BlitzPlus

Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL


Artemis ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.10.2007, 18:15 Nach oben    #3
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Meine BBCode-Klasse arbeitet so, dass es von "außen nach innen" die BBCodes abarbeitet und ich dem entsprechenden Tag sagen kann, ob es quasi-rekursiv durchsucht werden soll nach weiteren BBCodes. Natürlich habe ich das nur für den "noparse"-Tag gemacht, aber vielleicht ergibt sich irgendwann nochmal eine günstigere Gelegenheit, bei der das von größeren Nutzen sein kann (nicht, dass es jetzt keinen Nutzen hätte).
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.10.2007, 20:07 Nach oben    #4
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.212
Standard

mmh... das 'von-außen-nach-innen' wäre natürlich noch eine Idee.
Derzeit arbeite ich die einfach Stück für Stück ab.

Die 'von-außen-nach-innen'-Methode erscheint mir die sauberere Methode zu sein, mit jedoch dem Nachteil, dass... ich keine Ahnung hätte, wie ich das alles umbauen müsste...
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.10.2007, 23:42 Nach oben    #5
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 58
Standard

Vll. bringt dich das Beispiel #1720 http://de2.php.net/manual/en/functio...e-callback.php weiter.

bobby.
bobby ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.10.2007, 08:43 Nach oben    #6
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Nur mal als Beispiel: Ich habe meine BBCodes vorher ja mit Zahlen markiert, damit hinterher mit einem einfachen RegEx auch immer die passenden Paare gefunden werden:

PHP-Code:
[noparse]/* [...] */
    
$bbcode = array (); // Hier werden die BBCodes mit einem Count gespeichert
    // $value beinhaltet den zu durchsuchenden Text
    
if (preg_match_all ('/(?:\[(\/?)([\w]+)([^\]]*)\])/s'$value$vars) > 0)
    {
      
// Jeden gefundenen Code durchlaufen
      
for ($i 0;
      
$i count ($vars[0]);
      
$i++)
      {
        
// Prüfen, ob der BBCode (z.B. "b" in "[b]") überhaupt definiert ist (hier im Array $this->code als Key)
        
if (isset ($this->code[$vars[2][$i]]) === TRUE)
        {
          
// Prüfen, ob dem BBCode kein "/" vorangestellt ist
          
if (empty ($vars[1][$i]) === TRUE)
          {
            
// Prüfen, ob ein BBCode diesen Typs bereits gezählt wurde (Array: $bbcode) oder ob dieser BBCode-Typ als "SINGLE_TAG" (im Array $this->code) definiert wurde
            
if (isset ($bbcode[$vars[2][$i]]) === FALSE
            
|| $this->code[$vars[2][$i]]['SINGLE_TAG'] === TRUE)
            {
              
// Erstmaliges Setzen des Counters
              
$bbcode[$vars[2][$i]] = 0;
            }
            
// Counter erhöhen
            
$bbcode[$vars[2][$i]]++;
          }

          
// $single_tag mit einem Schließen-Tag befüllen, sollte der Code als "SINGLE_TAG" definiert sein (z.B. "[br]" wäre ein "SINGLE_TAG", dann wird §single_tag mit "[/br:1]" befüllt (Der Count bei "SINGLE_TAG"s ist immer 1!))
          
$single_tag = (($this->code[$vars[2][$i]]['SINGLE_TAG'] === TRUE) ? '[/'.$vars[2][$i].':'.$bbcode[$vars[2][$i]].']' '');

          
// Prüfen, ob Counter für BBCode größer als 0
          
if ($bbcode[$vars[2][$i]] > 0)
          {
            
// Fügt dem gefundenen String den Count hinzu (z.B. wird aus "[b]" dann "[b:1]"), $single_tag wird angefügt (Close-Tag für "SINGLE_TAG"s
            
$value preg_replace ('/'.preg_quote ($vars[0][$i], '/').'/s''['.$vars[1][$i].$vars[2][$i].':'.$bbcode[$vars[2][$i]].$vars[3][$i].']'.$single_tag$value1);
          }

          
// Prüfen, ob dem BBCode kein "/" vorangestellt ist (z.B. bei "[/b]")
          
if ($vars[1][$i] == '/')
          {
            
// Counter verringern
            
$bbcode[$vars[2][$i]]--;
          }
        }
      }
    }
/* [...] */[/noparse
Entschuldigt bitte den schlechten Coding-Style, das Script stammt noch aus einer früheren Epoche meiner kreativen Phase
Wie die Informationen letztendlich gespeichert werden, auf die du dann zugreifst ist ja egal, in dem Snippet ist es halt noch ein Array in dem Objekt, da es eine Methode aus einer Klasse ist (oder besser ein Teil davon). Ich denke du hast genug Erfahrung um das deinen Wünschen anzupassen

So, nach diesem Snippet sieht folgender Beispieltext:

Code:
[b]Dies ist ein [u]Test[/u] und [b]dabei[/b] bleibt es [u]auch! Dies ist [u]ein [b]Test[/b][/u] und[/u] dabei bleibt es auch! Dies ist ein Test und dabei bleibt es auch![/b]
dann so aus:

Code:
[b:1]Dies ist ein [u:1]Test[/u:1] und [b:2]dabei[/b:2] bleibt es [u:1]auch! Dies ist [u:2]ein [b:2]Test[/b:2][/u:2] und[/u:1] dabei bleibt es auch! Dies ist ein Test und dabei bleibt es auch![/b:1]
Nun können die BBCodes mit folgendem RegEx ausgelesen werden:

PHP-Code:
preg_match_all ('/(?:\[([\w]+)(\:[\d]+)([^\]]*)\])(.*)(?:\[\/\1\2\])/Us'$value$vars); 
Ich hoffe, dass die Arbeitsweise dieses RegEx einigermaßen schlüssig ist, wenn nciht, bitte nochmal Fragen stellen, dann kann ich das noch etwas näher erläutern.

EDIT: Ich hoffe ich konnte dir damit überhaupt helfen?! Achja und bevor ich es vergesse: Parameter sind in den BBCodes natürlich auch möglich, die stehen nach dem RegEx in Feld 3 als kompletter String, da musst du dann eventuell auch nochmal "parsen", sofern du Parameter überhaupt ermöglichen möchtest.

EDIT2: Was man im Kopf nicht hat... Der RegEx arbeitet natürlich deswegen "von Innen nach Außen", weil immer nur die "äußersten" Codes gefunden werden. Der "Inhalt" der BBCodes (Feld 4) muss rekursiv natürlich wieder von dem RegEx behandelt werden, sofern es das denn darf. Und genau da kommt dein Wunsch ins Spiel: [noparse] darf nicht! Und siehe da: Es ist alles gelöst, was du haben wolltest
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll

Geändert von MrNiceGuy (20.10.2007 um 08:52 Uhr).
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.10.2007, 14:17 Nach oben    #7
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard

Seit rekursive Regex möglich sind, ist das nummerieren der BBCodes nicht mehr nötig.

Einfach wie im Beispiel aus dem Manual:
Zitat:
Zitat von bobby Beitrag anzeigen
Vll. bringt dich das Beispiel #1720 http://de2.php.net/manual/en/functio...e-callback.php weiter.

bobby.
in der Funktion den BBCode behandeln. Dabei wird der BBCode von Außen nach Ihnen verarbeitet. Evtl. den Regex noch ergänzen, damit auch die Parameter gleich mit herausgefiltert werden.

Möglich währe aber auch den Regex etwas umzuschreiben, damit die NOPARSE-BBCode mit dem Inhalt ignoriert wird und erst nach der Verarbeitung die NOPARSE-Tags zu löschen.
dago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.10.2007, 14:47 Nach oben    #8
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Cool, den kannte ich noch garnicht, wurde in den RegEx-Tutorials irgendwie nie erwähnt, scheint aber auch eine spezielle Besonderheit von PHP zu sein mit dem (?R), denn sonst habe ich das nirgends gefunden. Würde ja bedeuten, dass der Modifier "R" im Suchstring eingebunden werden soll. Aber es gibt eigentlich keinen Modifier "R"!? Hat da jemand nähere Informationen zu, ob das Standard ist oder eine PHP-Besonderheit? Wäre ja auch für andere Programmiersprachen nützlich!?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.10.2007, 15:26 Nach oben    #9
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard

Kenn das auch nur von PHP. Ist aber schon etwas länger das ganze möglich.

Dazu aus dem Manual: http://de2.php.net/manual/en/referen...ern.syntax.php
Zitat:
Consider the problem of matching a string in parentheses, allowing for unlimited nested parentheses. Without the use of recursion, the best that can be done is to use a pattern that matches up to some fixed depth of nesting. It is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an experimental facility that allows regular expressions to recurse (among other things). The special item (?R) is provided for the specific case of recursion. This PCRE pattern solves the parentheses problem (assume the [url="http://de2.php.net/manual/en/reference.pcre.pattern.modifiers.php"]PCRE_EXTENDED[/url] option is set so that white space is ignored:( \( ( (?>[^()]+) | (?R) )* \)
Funktionierte bei mir auch bei Webhostern problemlos.
dago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.10.2007, 16:21 Nach oben    #10
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

OK, da ist dann halt das Problem, wenn man generelle RegEx-Tutorials betrachtet, in denen das nie behandelt wurde... Sehr cool die Funktion jedenfalls. Werde ich demnächst bei meiner BBCode-Klasse übernehmen denke ich Danke nochmal für den Hinweis!
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.10.2007, 17:06 Nach oben    #11
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.212
Standard

@booby:
danke für den link. Hier nochmal mit den richtigen Anker:
http://de2.php.net/manual/en/functio....php#id3412414

Jut - dann... wartet da wohl ein wenig Arbeit auf mich

Da das nicht sooo dringend ist - und ich mich da erstmal gewaltig einlesen muss, werde ich das ein wenig nach hinten schieben.
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.12.2007, 15:46 Nach oben    #12
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.212
Standard

als Nachtrag sei hier noch das Tutorial von MrNiceGuy erwähnt:
[php] BBCode-Parser mit [noparse]-Tag selbst gemacht
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!

Geändert von Ben (03.12.2007 um 16:12 Uhr).
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.12.2007, 16:06 Nach oben    #13
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 591
Standard

Link ist irgendwie falsch
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.12.2007, 18:48 Nach oben    #15
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.212
Standard

sry. danke.
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
html in bbcode umformen ? robo47 Gesuche 8 23.08.2008 11:50
[url] BBCode Garnele PHP-Programmierung 11 03.12.2007 18:52
[suche] WYSIWYG BBCode Editor Jann Hendrik Gesuche 4 16.10.2007 20:19
Problem mit dem verlinken innerhalb von pdf-Dokumenten wegen der Nutzung von BBCode Jann Hendrik PHP-Programmierung 3 10.02.2006 16:27
RegExp-Problem mit [url]-tag (BBCode) Jann Hendrik PHP-Programmierung 4 03.07.2005 20:08


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:58 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

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