[PHP] BBcodes probleem

Pagina: 1
Acties:
  • 289 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Topicstarter
Hallo mede tweakers

Ik heb een probleempje. Met behulp van str_replace vervang ik html codes zoals voorbeeld:
PHP:
1
2
    $inhoud = str_replace("[me]","<span class=\"kop2\">* ", $inhoud);
    $inhoud = str_replace("[/me]","</span>", $inhoud);


en voor quotes gebruik ik

PHP:
1
2
    $inhoud = str_replace("[quote]","<table width=\"480\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tabel2\"><tr>\n<td valign=\"top\" height=\"10\" bgcolor=\"#EFEFEF\" class=\"nieuws\">", $inhoud);
    $inhoud = str_replace("[/quote]","</td></tr></table>", $inhoud);



Alleen de probleem is als gebruikers de bbcodes niet afsluiten met [ /quote] dan is de layout namelijk verziekt. De quote functie bijvoorbeeld van deze forum is anders die zal niet zo problemen opleveren als die van mij, alleen ik wil deze gebruiken omdat er ook een andere achter grond en een tabel rand eromheen zit. Ik heb van alles geprobeerd en bedacht maar ik kom er niet uit.

Is er een makkelijk oplossing voor dit probleem ?

[ Voor 16% gewijzigd door Shift op 24-09-2003 20:10 ]


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 13:04
Wat je zou kunnen doen is als er geen [/quote] staat, dat achteraan toevoegen. Het is redelijk onmogelijk om te gokken waar die anders moet staan ;)

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Misschien moet je denken aan een ingewikkeldere replace, waarin je niet alleen het begin maar ook het eind in een keer doet?

|>


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Topicstarter
Simon schreef op 24 September 2003 @ 20:12:
Misschien moet je denken aan een ingewikkeldere replace, waarin je niet alleen het begin maar ook het eind in een keer doet?
Jah daar heb ik wel aangedacht maar kwam er niet echt uit. Ik dacht om een controle mechanisme te bouwen die controleerd of er voor elke [ quote] een [ /quote] is, maar dat is te lastige oplossing.

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Shift schreef op 24 september 2003 @ 20:13:
[...]


Jah daar heb ik wel aangedacht maar kwam er niet echt uit. Ik dacht om een controle mechanisme te bouwen die controleerd of er voor elke [ quote] een [ /quote] is, maar dat is te lastige oplossing.
Als je dat in een keer met een replace doet, replacet hij niet als hij niet de afsluitende 'quote' kan vinden.. Veel makkelijker..

|>


  • Jordi
  • Registratie: Januari 2000
  • Niet online

Jordi

#1#1

Mja, regexklusje. Is in het begin ff wazig, maar ben je van al dat ge-eikelestein met lamme tag gebruikers af ;)
PHP:
1
$inhoud = preg_replace("/\\[quote\](.*?)\\[\/quote\]/is", "hier-je-quote-start-HTML $1 hier-je-quote-einde-HTML", $inhoud);

De andere tags (ja er zijn er nogal wat in omloop) mag je zelf bedenken :p

Het zal wel niet, maar het zou maar wel.


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Topicstarter
Jotti schreef op 24 september 2003 @ 20:24:
Mja, regexklusje. Is in het begin ff wazig, maar ben je van al dat ge-eikelestein met lamme tag gebruikers af ;)
PHP:
1
$inhoud = preg_replace("/\\[quote\](.*?)\\[\/quote\]/is", "hier-je-quote-start-HTML $1 hier-je-quote-einde-HTML", $inhoud);

De andere tags (ja er zijn er nogal wat in omloop) mag je zelf bedenken :p
Wheeeuuwww, :) supper dit is heel mooi ik vond die regex lastig maar ik had niet het idee dat het zo mooi zou werken :) Heel errug bedankt voor je tijd en ander medetweakers.

  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

of je doet gewoon lekker geen fuck.. en je knipt het gewoon uit phpbb2 :]
8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7

PHP:
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
function bbcode_array_pop(&$stack) {
   $arrSize = count($stack);
   $x = 1;
   while(list($key, $val) = each($stack)) {
      if($x < count($stack)) {
     $tmpArr[] = $val;
      }
      else {
     $return_val = $val;
      }
      $x++;
   }
   $stack = $tmpArr;
   return($return_val);
}


function bbcode_array_push(&$stack, $value) {
   $stack[] = $value;
   return(sizeof($stack));
}

function bbencode_quote($message)
{
    // First things first: If there aren't any "[quote]" strings in the message, we don't
    // need to process it at all.

    if (!strpos(strtolower($message), "[quote]"))
    {
        return $message;
    }

    $stack = Array();
    $curr_pos = 1;
    while ($curr_pos && ($curr_pos < strlen($message)))
    {
        $curr_pos = strpos($message, "[", $curr_pos);

        // If not found, $curr_pos will be 0, and the loop will end.
        if ($curr_pos)
        {
            // We found a [. It starts at $curr_pos.
            // check if it's a starting or ending quote tag.
            $possible_start = substr($message, $curr_pos, 7);
            $possible_end = substr($message, $curr_pos, 8);
            if (strcasecmp("[quote]", $possible_start) == 0)
            {
                // We have a starting quote tag.
                // Push its position on to the stack, and then keep going to the right.
                bbcode_array_push($stack, $curr_pos);
                ++$curr_pos;
            }
            else if (strcasecmp("[/quote]", $possible_end) == 0)
            {
                // We have an ending quote tag.
                // Check if we've already found a matching starting tag.
                if (sizeof($stack) > 0)
                {
                    // There exists a starting tag.
                    // We need to do 2 replacements now.
                    $start_index = bbcode_array_pop($stack);

                    // everything before the [quote] tag.
                    $before_start_tag = substr($message, 0, $start_index);

                    // everything after the [quote] tag, but before the [/quote] tag.
                    $between_tags = substr($message, $start_index + 7, $curr_pos - $start_index - 7);

                    // everything after the [/quote] tag.
                    $after_end_tag = substr($message, $curr_pos + 8);

                    $message = $before_start_tag . "<TABLE BORDER=0 ALIGN=CENTER WIDTH=95%><TR><TD><font style=\"FONT-SIZE: 10px;  COLOR: #999999;\">Quote:</font></TD></TR><TR><TD class=barinhoud>";
                    $message .= $between_tags . "</TD></TR><TR><TD></TD></TR></TABLE>";
                    $message .= $after_end_tag;

                    // Now.. we've screwed up the indices by changing the length of the string.
                    // So, if there's anything in the stack, we want to resume searching just after it.
                    // otherwise, we go back to the start.
                    if (sizeof($stack) > 0)
                    {
                        $curr_pos = bbcode_array_pop($stack);
                        bbcode_array_push($stack, $curr_pos);
                        ++$curr_pos;
                    }
                    else
                    {
                        $curr_pos = 1;
                    }
                }
                else
                {
                    // No matching start tag found. Increment pos, keep going.
                    ++$curr_pos;
                }
            }
            else
            {
                // No starting tag or ending tag.. Increment pos, keep looping.,
                ++$curr_pos;
            }
        }
    } // while

    return $message;

}

8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7 8)7
blabla copyright @ phpBB.com
_____________
zo aanroepen
PHP:
1
2
3
<?
$msg = bbencode_quote($msg);
?>

[ Voor 7% gewijzigd door dip op 24-09-2003 20:45 . Reden: ???????????????????? ]

It's scientifically known, that base improves the tase of cheezes!


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Topicstarter
de quote functie van phpBB is een heel lastige manier en lange code, wat ik ook in gedachten had met contorle mechanisme enz. Maar regexp is beter oplossing. Toch bedankt :)

  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

hmja mag wel zo zijn
maar de phpbb code controleert iig of de [.quote] ook afgesloten word [./quote]
dat doet jouw regexp niet :P

[ Voor 1% gewijzigd door dip op 24-09-2003 20:47 . Reden: bah stomme [quote] shit :P ]

It's scientifically known, that base improves the tase of cheezes!


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Topicstarter
dip schreef op 24 September 2003 @ 20:47:
hmja mag wel zo zijn
maar de phpbb code controleert iig of de [.quote] ook afgesloten word [./quote]
dat doet jouw regexp niet :P
Hmm, dat is waar.

-edit- Maf, die code werkt niet :) ik heb een paginaatje gemaakt met de bbcode functie en test code zoals volgt

PHP:
1
2
3
4
$inhoud = "[.quote]aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[./quote]";
$inhoud = bbencode_quote($inhoud);

echo $inhoud;


output is : [.quote]aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[./quote]

[ Voor 44% gewijzigd door Shift op 24-09-2003 21:02 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
ahum...beetje code lezen mag wel: haal die punt weg bij [.quote]

{signature}


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Topicstarter
dat punt zit daar normaal niet :) Ik heb de code doorgelopen hij doet echt helemaal niets.
Voorbeeld te zien op : http://www.helinium.nl/test.txt

De code stopt hierow :
PHP:
1
2
3
4
 if (!strpos(strtolower($message), "[quote]")) 
    { 
        return $message; 
    }

[ Voor 39% gewijzigd door Shift op 24-09-2003 21:19 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Test eens met "bla[ quote]Kwoot[/ quote]".

[ Voor 21% gewijzigd door Voutloos op 24-09-2003 21:24 ]

{signature}


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Topicstarter
Voutloos schreef op 24 september 2003 @ 21:24:
Test eens met "bla[ quote]Kwoot
".[/quote]

Jah dat werkt wel, maar ik moet toch ook direct met een quote kunne beginnen of is dat gek ofzow?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nou strpos (ik ken geen PHP maar dat is bij andere talen wel zo, geeft een numerieke waarde terug. Alle cijfers behalve 0 zijn true als boolean. En hier is de index 0 dus false.

Blijkbaar in PHP ook zo. Dus daar moet je iets voor vinden.

{signature}


  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

dip schreef op 24 September 2003 @ 20:43:
of je doet gewoon lekker geen fuck.. en je knipt het gewoon uit phpbb2 :]
<knip>
_____________
zo aanroepen
PHP:
1
2
3
<?
$msg = bbencode_quote($msg);
?>
Is dit niet enorm omslachtig voor alleen maar het maken van een enkele ubbtag? Je kan toch gewoon beter een normale regex gebruiken zoals Jotti plaatste. Dat is één regel inplaats van 105 regels aan code (weliswaar wel met een hoop commentaar en witruimte).

Wat is eigenlijk sneller, een regex of met substr en dan vervangen.

offtopic:
dip kun je die smilie rijen niet weghalen. Ze zijn bijzonder irritant.

[ Voor 10% gewijzigd door dArtagnan op 24-09-2003 22:32 ]


  • Jordi
  • Registratie: Januari 2000
  • Niet online

Jordi

#1#1

str_replace is snelst. dan preg_replace, dan ereg_replace (deze kan je dus net zo goed _niet_ gebruiken :) )
Staat wel tegenover dat ?reg_replace veel meer kan dan str_replace natuurlijk :)
edit:
str_replace _an sich_ is sneller. op het moment dat je hele constructies gaat bouwen zoals met die phpBB code... dan is een regex sneller ja....

Je kan beter zelf een "parser" schrijven. Hoe je dat doet, maakt eigenlijk niet zoveel uit (als het maar goed gebeurt :P ), want als je andermans parsers gaat gebruiken, loop je altijd weer tegen gezanik op... de parser uit mijn forum bevat de nodige workarounds/ranzigheden etc. voor mensen die op fora gewend zijn hele ASCII art dingen te posten mbv. templates die in vBulletin (inclusief handje vol hacks etc.) werken, die ik eerst by design niet had werken ([b] etc. in [code].. yuck :r , maar de klant is koning). Vraag me niet wie die mensen zijn, je wilt het _niet_ weten :P
Naja, als je toch nog interesse hebt: http://jotti.dhs.org/devforum/parsert.phps enzo. Niet letterlijk overnemen! Daar leer je niks van (en gaat wsl in jouw situatie ook niet lekker werken).

[ Voor 13% gewijzigd door Jordi op 24-09-2003 22:27 ]

Het zal wel niet, maar het zou maar wel.


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
regex is eigenlijk mooier/overzichtelijker, en het zou me niet verbazen als het ook sneller was.

Eigenlijk vind ik die phpbb2 code beetje lomp, maak dan de functie met parameters voor de te vervangen tags, dan is hij handiger.

{signature}


  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Topicstarter
Het klopt dat de code van phpBB lomp is, enige mogelijkheid met phpBB code is dat je een quote in quote kan hebben met regexp kan dat niet dus. Ik hou toch die regexp :) Bedankt voor jullie aandacht.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Misschien verstandig op uit teleggen hoe je regexen kunt schrijven en hoe ze in elkaar zitten. Iets "lenen" en dan niet begrijpen wat het doet is niet echt de Tweakers gedachte dacht ik. Hier een topic waar info staat over regexen:
Reguliere Expressie, How to learn
Hier staan wat rexes uitgelegt in mensen taal:
Het grote Regex field check topic

[ Voor 4% gewijzigd door vinnux op 24-09-2003 23:33 ]


  • Vampier
  • Registratie: Februari 2001
  • Laatst online: 20-04-2015

Vampier

poke-1,170

stelletje n00bs

PHP:
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
function ubbreplace($text){
  $text = htmlEntities($text);  
  $text = preg_replace( "/\r/is", "", $text );
  $text = preg_replace( "/\n/is", "<br />", $text );
  $text = preg_replace( "/\[col=(.+?)\](.+?)\\[\/col\]/is", '<font color="\\1">\\2</font>', $text );
    
    // layout
    $tagArray['s'] = array('open'=>'<s>','close'=>'</s>');
    $tagArray['b'] = array('open'=>'<b>','close'=>'</b>');
    $tagArray['i'] = array('open'=>'<i>','close'=>'</i>');
    $tagArray['u'] = array('open'=>'<u>','close'=>'</u>');
    $tagArray['sub'] = array('open'=>'<sub>','close'=>'</sub>');
    
    // Quote tags
    $tagArray['quote'] = array('open'=>'<blockquote><font class="quote">quote:</font><hr />','close'=>'<hr /></blockquote>');
        
    // URL Tags
    $tagArray['url'] = array('open'=>'<a href="','close'=>'" target="_blank">\\1</a>');
    $tagArray['url=(.*)'] = array('open'=>'<a href="','close'=>'" target="_blank">\\2</a>');
    
    // COLOR tags
    $tagArray['color=(.*)'] = array('open'=>'<font color="','close'=>'">\\2</font>');
    $tagArray['col=(.*)'] = array('open'=>'<font color="','close'=>'">\\2</font>');
    
    // e-mail tags
    $tagArray['email'] = array('open'=>'<a href="mailto:','close'=>'">\\1</a>');
    $tagArray['email=(.*)'] = array('open'=>'<a href="mailto:','close'=>'">\\2</a>');
    
    // Image tags
    $tagArray['img'] = array('open'=>'[img]"','close'=>'"[/img]');
    $tagArray['img=(.*),(.*)'] = array('open'=>'[img]"\\3"[/img]');
    
    // Array of tags with only one part
    $sTagArray['br'] = array('tag'=>'<br />');
    $sTagArray['hr'] = array('tag'=>'<hr />');

    foreach($tagArray as $tagName=>$replace){
         $tagEnd=preg_replace('/\W/Ui','',$tagName);
         $text = preg_replace("|\\[$tagName\](.*)\\[/$tagEnd\]|Ui","$replace[open]\\1$replace[close]",$text);
    }
    foreach($sTagArray as $tagName=>$replace){
         $text= preg_replace("|\\[$tagName\]|Ui","$replace[tag]",$text);
    }
        
    return $text;
}


en weer terug

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function reverseUbb($var){

  $var = preg_replace( '/<b>(.+?)\<\/b>/is', "[b]\\1[/b]", $var );
  $var = preg_replace( '/<i>(.+?)\<\/i>/is', "[i]\\1[/i]", $var );  
  $var = preg_replace( '/<u>(.+?)\<\/u>/is', "[u]\\1[/u]", $var );  
  $var = preg_replace( '/<s>(.+?)\<\/s>/is', "[s]\\1[/s]", $var );    
  $var = preg_replace( '/<sub>(.+?)\<\/sub>/is', "[sub]\\1[/sub]", $var );    
  
  $var = preg_replace( '/<a href="(.+?)\" target="_blank">(.+?)\<\/a>/is', "[url=\\1]\\2[/url]", $var );

  $var = preg_replace( '/[img]"(.+?)\"[/img]/is', "[img=\\1,\\2]\\3[/img]", $var );
  $var = preg_replace( '/[img]"(.+?)\"[/img]/is', "[img]\\1[/img]", $var );
  
  
  //$var = preg_replace( '/<blockquote><font class="quote">Quote :<\/font><hr \/>(.+?)\<hr \/><\/blockquote>/is', "[quote]\\1[/quote]", $var );
  
  $var = preg_replace( '/<blockquote><font class=\"quote\">quote:<\/font><hr \/>(.+?)\<hr \/><\/blockquote>/is', "[quote]\\1[/quote]", $var );
  $var = preg_replace( '/<font color=\"(.+?)\\">(.+?)\<\/font>/is', "[col=\\1]\\2[/col]", $var );
  $var = preg_replace( '/<br \/>/is', "\n", $var );
  $var = preg_replace( '/<hr \/>/is', "[hr]", $var );
  return $var;
}


gedeeltelijke © 2003 Patrick van Arkel / www.vampier.net maar bij deze geef ik toestemming aan GoT om deze parser te gebruiken... indien je hem gebruikt svp mij even in de credits vermelden ;)

Verwijderd

Je zou even op phpclasses.org moet zoeken op bbcode daar staat een super class tussen, die gebruik ik zelf ook en enorm handig.

  • Jordi
  • Registratie: Januari 2000
  • Niet online

Jordi

#1#1

Shift schreef op 24 september 2003 @ 23:08:
Het klopt dat de code van phpBB lomp is, enige mogelijkheid met phpBB code is dat je een quote in quote kan hebben met regexp kan dat niet dus.
Ik heb toch echt mbv een preg_match en een preg_replace al een aardig tijdje nested quotes (en edits en offtopics] support hoor :)

offtopic:
Ow en vampier: met die parser van jou - leuk opgebouwd trouwens - kun je volgens mij nog (pin me er niet op vast, vluchtigjes bekeken) best wat leuke geintjes uithalen met javascript in [img] tags etc...

[ Voor 24% gewijzigd door Jordi op 25-09-2003 00:00 ]

Het zal wel niet, maar het zou maar wel.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

offtopic:
Jotti wtf doe jij in P&W? :P

Professionele website nodig?


  • Jordi
  • Registratie: Januari 2000
  • Niet online

Jordi

#1#1

offtopic:
ben de weg kwijt 8)7

Het zal wel niet, maar het zou maar wel.


Verwijderd

offtopic:
shift: nogmaals bedankt, ik gebruik het lcd nog steeds(servertje) :9

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Vampier schreef op 24 September 2003 @ 23:37:
stelletje n00bs

....

gedeeltelijke © 2003 Patrick van Arkel / www.vampier.net maar bij deze geef ik toestemming aan GoT om deze parser te gebruiken... indien je hem gebruikt svp mij even in de credits vermelden ;)
zo speciaal is deze niet hoor :P, of ga je er een softwarepatent op aanvragen :X

Acties:
  • 0 Henk 'm!

  • Vampier
  • Registratie: Februari 2001
  • Laatst online: 20-04-2015

Vampier

poke-1,170

flashin schreef op 25 September 2003 @ 08:35:
[...]


zo speciaal is deze niet hoor :P, of ga je er een softwarepatent op aanvragen :X
De parser werkt goed en het is eigenlijk een probeersel hoe ik mijn blog beter kon maken. Bovendien post ik veel postings van mijn blog ook bij de buren (fok!) dus dat was mooi meegenomen.

-erg offtopic-
Ik woon in Amerika... geen zin in rechtzaken ;)

[ Voor 31% gewijzigd door Vampier op 26-09-2003 07:56 ]


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Vampier schreef op 24 September 2003 @ 23:37:
stelletje n00bs

[...]
gedeeltelijke © 2003 Patrick van Arkel / www.vampier.net maar bij deze geef ik toestemming aan GoT om deze parser te gebruiken... indien je hem gebruikt svp mij even in de credits vermelden ;)
Waarom doe je de 'heenweg' netjes met arrays waarin je alle BB codes definieert, maar de 'terugweg' niet? Lijkt me handig om dan dezelfde definities te gebruiken.

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • Vampier
  • Registratie: Februari 2001
  • Laatst online: 20-04-2015

Vampier

poke-1,170

De terugweg met regex werkt goed genoeg. De parser is trouwens gedeeltelijk afkomstig van Ronaan (een Fok-ker weet niet ofdat jij op GoT zit) ik gebruik de 'terug' parser alleen als ik even snel iets wil editen.
Pagina: 1