[PHP] BBCode probleem

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
Ben bezig met zelf een forum schrijven, maar het deel van de BBCode gaat erg mis. Ik heb nu:

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
<?

    function code($f){
        $f = str_replace("&amp;", "&", $f);

        $regels = count(explode("<br>", nl2br($f)));
        $regels2 = count(explode("<br \>", nl2br($f)));
        $regels3 = count(explode("\n",  nl2br($f)));
        $f = str_replace("&gt;", ">", $f);
        $f = str_replace("&lt;", "<", $f);
        $f = str_replace("&quot;", "\"", $f);
        $f = str_replace("\"", "\\\"", $f);
        $f = str_replace("&acute;", "`", $f);
        $f = htmlspecialchars($f);

        $code = str_replace("&amp;", "&", $code);
        $return = "<div style=\"width: 550px; overflow: auto; table-style: fixed;\">Code:<br><table width=\"400\" style=\"font-family: courier new; font-size: 12px;\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\"><tr><td valign=\"top\">";
        for ($i = 1; $i < ($regels + $regels2 + $regels3); $i++){
            $return .=  $i . "<br>";
        }
        $return .=  "</td><td valign=\"top\"><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td nowrap>" .  stripslashes(nl2br($f)) . "</td></tr></table></td></tr></table></div>";
        return $return;

    }
function quote($f){
    return "<div class=\"mainquote\">Quote:<div class=\"quote\">" . $f. "</div></div>";
}
function ubb($f){
    $f = nl2br($f);
    $query = mysql_query("SELECT * FROM `" . $GLOBALS['prefix'] . "smilies`");
    while ($row = mysql_fetch_array($query)){
        $f = str_replace($row['shortcut'], "[img]'"[/img]", $f);
    }
    $f = preg_replace("/\[quote](.+?)\\[\/quote]/ise", "quote('\\1')", ($f));
    $f = preg_replace("/\[message=(.*?)\](.+?)\\[\/message]/isD", '<a href="singlepost.php?post=\\1">\\2</a>', ($f));
    $f = preg_replace("/\[img]http:\/\/(.+?)\\[\/img]/isD", '[img]"http://\\1"[/img]', ($f));
    $f = preg_replace('#(^|[\n ])(http://[^ \n\r\t<]*)#is', '\\1<a href="\\2" target="_BLANK">\\2</a>', $f);
    $f = preg_replace('#(^|[\n ])(www.[^ \n\r\t<]*)#is', '\\1<a href="http://\\2" target="_BLANK">\\2</a>', $f);

    $f = str_replace("[b]", "<b>", ($f));
    $f = str_replace("[/b]", "</b>", ($f));
    $f = str_replace("[i]", "<i>", ($f));
    $f = str_replace("[/i]", "</i>", ($f));
    $f = str_replace("[u]", "<u>", ($f));
    $f = str_replace("[/u]", "</u>", ($f));
    return $f;
}


Nou wil ik 't zo maken dat je geen icoontjes / afbeelding in een [ code] ... [/code] hebt, dus dat ALLES wordt geparsed behalve dat wat tussen [ code] en [/code] staat ...

iemand enig idee? O-)

[ Voor 26% gewijzigd door lennartkocken op 05-05-2006 20:16 ]

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Ja, een andere manier dan regexpbased gebruiken. Bijvoorbeeld stackbased (zie de parser van phpBB) of recursief.

@hierbeneden: Zou best kunnen, ik heb de source van phpBB nog nooit gezien, ik heb alleen maar ooit ergens opgevangen dat die parser stackbased zou zijn.

[ Voor 42% gewijzigd door AtleX op 06-05-2006 09:34 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

De parser van phpBB is AFAIK helemaal niet stackbased? :o In phpBB gebruiken ze intern [quote:23495] tags, die bij het editen weer teruggezet worden naar [quote]. Op die manier maken ze nesting mogelijk met regexps. Dus tenzij hun systeem veranderd is in een van de nieuwere versies gebruiken ze in phpBB ook "gewoon" regexps. :)

Overigens is een stackbased parser hier inderdaad wel een goede oplossing. Een andere manier is om met assertions te werken, maar daar worden regexps ook niet leesbaarder op en uiteindelijk krijg je een product dat functioneel ondergeschikt is aan zo'n parser. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
Oke, en nu effe in n00btaal alstublieft? :P
offtopic:
Stackbased...?

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je kàn natuurlijk ook even Google gebruiken als je een term tegenkomt die je niet kent. ;)
[google=php stackbased parser]
[google=php stack based parser]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Een andere manier is om vantevoren de matches op code-tags op te slaan en later weer terug te zetten:
PHP:
1
2
3
4
5
6
7
8
9
preg_match_all('/\\[code\](.*?)\\[\/code\]/is', $content, $codematches);

// andere replaces

if (!empty($codematches))
{
    $i = 0;
    $content = preg_replace('/\\[code\](.*?)\\[\/code\]/ise', '\'<pre>\'.htmlspecialchars(\$codematches[1][\$i++]).\'</pre>\'', $content);
}

het is een workaround maar werkt...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
zodra ik de $codematches door een functie haal waar html bij wordt gemaakt (bijv. een tabel met regelnummering) gaat het mis... door een functie halen zónder html gaat wel goed. Hoe maak ik 't dan dat het ook mét html werkt? _/-\o_

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Wat heb je al en wat gaat er precies fout?

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
Hij geeft helemaal geen post meer weer waar een [code ] in zit.

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
<?
    function code($f){

        $regels = count(explode("<br>", nl2br($f)));
        $regels2 = count(explode("<br \>", nl2br($f)));
        $regels3 = count(explode("\n",  nl2br($f)));
        $f = str_replace("&quot;", "\"", $f);
        $f = str_replace("\"", "\\\"", $f);
        $f = str_replace("&acute;", "`", $f);
        $return = "<div style=\"width: 550px; overflow: auto; table-style: fixed;\">Code:<br><table width=\"550\" cellspacing=\"0\" style=\"border-right: black solid 1px;border-top: black solid 1px;border-left: black solid 1px;\"><tr><td width=\"10\" bgcolor=\"#DCD9D6\"><strong>";
        for ($i = 1; $i < ($regels + $regels2 + $regels3); $i++){
            $return .=  $i . "<br>";
        }
        $return .=  "</strong></td><td valign=\"top\" nowrap>" .  (stripslashes($f)) . "</td></tr></table></div>";
        return $return;

    }

function quote($f){
    return "<div class=\"mainquote\">Quote:<div class=\"quote\">" . $f. "</div></div>";
}
function ubb($f){

    $f = nl2br($f); 
preg_match_all('/\\[code\](.*?)\\[\/code\]/is', $f, $codematches); 
    $query = mysql_query("SELECT * FROM `" . $GLOBALS['prefix'] . "smilies`");
    while ($row = mysql_fetch_array($query)){
        $f = str_replace($row['shortcut'], "[img]'"[/img]", $f);
    }
    



    $f = preg_replace("/\[quote](.+?)\\[\/quote]/ise", "quote('\\1')", ($f));
    $f = preg_replace("/\[message=(.*?)\](.+?)\\[\/message]/isD", '<a href="singlepost.php?id=\\1#\\1">\\2</a>', ($f));
    $f = preg_replace("/\[img]http:\/\/(.+?)\\[\/img]/isD", '[img]"http://\\1"[/img]', ($f));
    $f = preg_replace('#(^|[\n ])(http://[^ \n\r\t<]*)#is', '\\1<a href="\\2" target="_BLANK">\\2</a>', $f);
    $f = preg_replace('#(^|[\n ])(www.[^ \n\r\t<]*)#is', '\\1<a href="http://\\2" target="_BLANK">\\2</a>', $f);


    $f = preg_replace('/\[b](.*?)\\[\/b]/si', '<strong>\\1</strong>', $f);
    $f = preg_replace('/\[u](.*?)\\[\/u]/si', '<u>\\1</u>', $f);
    $f = preg_replace('/\[i](.*?)\\[\/i]/si', '<em>\\1</em>', $f);
if (!empty($codematches)) 
{ 
    $j = 0; 
    $f = preg_replace('/\\[code\](.*?)\\[\/code\]/ise', code('$codematches[1][$j++]'), $f); 
} 

    return $f;
}

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
En dan parsed-ie weer gewoon de smilies en opmaak d'rbij :P

hij parsed gewoon alles, behalve de [code ]'s :S dus krijg gewoon smilies d'rin en géén code-tabelletje d'romheen :S

[ Voor 64% gewijzigd door lennartkocken op 26-05-2006 12:38 ]

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
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
<?
    function code($f){
        //$f = str_replace("&amp;", "&", $f);
        $f = str_replace("&quot;", "\"", $f);
        //$f = str_replace("\"", "\\\"", $f);   
        $regels = count(explode("<br>", nl2br($f)));
        $regels2 = count(explode("<br \>", nl2br($f)));
        $regels3 = count(explode("\n",  nl2br($f)));
        $f = str_replace("<br \>", "", $f);
        $f = str_replace("\\", "\\\\", $f);

        $return = "<div style=\"width: 550px; overflow: auto; table-style: fixed;\">Code:<br><table width=\"550\" cellspacing=\"0\" style=\"border-right: black solid 1px;border-top: black solid 1px;border-left: black solid 1px;\"><tr><td width=\"10\" bgcolor=\"#DCD9D6\" valign=\"top\"><strong>";
        for ($i = 1; $i < ($regels + $regels2 + $regels3); $i++){
            $return .=  $i . "<br>";
        }
        $return .=  "</strong></td><td valign=\"top\" nowrap>" .  (($f)) . "</td></tr></table></div>";
        return $return;

    }

function quote($f){
    return "<div class=\"mainquote\">Quote:<div class=\"quote\">" . $f. "</div></div>";
}
function ubb($f){

    $f = nl2br($f); 
    preg_match_all('/\\[code\](.*?)\\[\/code\]/is', $f, $codematches); 
    $query = mysql_query("SELECT * FROM `" . $GLOBALS['prefix'] . "smilies`");
    while ($row = mysql_fetch_array($query)){
        $f = str_replace($row['shortcut'], "[img]'"[/img]", $f);
    }
    



    $f = preg_replace("/\[quote](.+?)\\[\/quote]/ise", "quote('\\1')", ($f));
    $f = preg_replace("/\[message=(.*?)\](.+?)\\[\/message]/isD", '<a href="singlepost.php?id=\\1#\\1">\\2</a>', ($f));
    $f = preg_replace("/\[img]http:\/\/(.+?)\\[\/img]/isD", '[img]"http://\\1"[/img]', ($f));
    $f = preg_replace('#(^|[\n ])(http://[^ \n\r\t<]*)#is', '\\1<a href="\\2" target="_BLANK">\\2</a>', $f);
    $f = preg_replace('#(^|[\n ])(www.[^ \n\r\t<]*)#is', '\\1<a href="http://\\2" target="_BLANK">\\2</a>', $f);


    $f = preg_replace('/\[b](.*?)\\[\/b]/si', '<strong>\\1</strong>', $f);
    $f = preg_replace('/\[u](.*?)\\[\/u]/si', '<u>\\1</u>', $f);
    $f = preg_replace('/\[i](.*?)\\[\/i]/si', '<em>\\1</em>', $f);
if (!empty($codematches)) 
{ 
    $j = 0; 
    $f = preg_replace('/\\[code\](.*?)\\[\/code\]/is', code($codematches[1][$j++]), $f); 
} 

    return $f;
}



Hij werkt _/-\o_ _/-\o_ Thnx Crisp en -Nme :D O-)

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

volgens mij werkt 'ie nu alleen voor de 1e code-tag ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
shit :P

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik denk dat je beter eerst door je codematches array heen kan lopen en door code() gooien en daarna pas de replace doen ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
code:
1
2
3
4
5
6
7
if (!empty($codematches)) 
{ 
    for ($j = 0; $j < count($codematches); $j++){
  
    $f = preg_replace('/\\[code\](.*?)\\[\/code\]/is', code($codematches[1][$j++]), $f); 
    }
}


zoals dit? Dit werkt namelijk niet :P

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • Scott
  • Registratie: December 2004
  • Laatst online: 20-09 21:57

Scott

Ik ben, dus ik tweak

Nee, moet je het zo doen:

PHP:
1
2
3
4
5
6
7
8
if (!empty($codematches)) 
{ 
    for ($j = 1; $j < count($codematches); $j++)  
        $codematches[1][$j-1] = code($codematches[1][$j-1]);

    for ($i = 1; $i < count($codematches); $i++)
        $f = preg_replace('/\\[code\](.*?)\\[\/code\]/is', $codematches[1][$i-1], $f);
}


Werkt dit wel ?

Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
Werkt niet...

krijg nog steeds 2x dezelfde code waar het 2x verschillend moet zijn...

[ Voor 75% gewijzigd door lennartkocken op 26-05-2006 16:00 ]

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Of zo:
PHP:
1
2
3
4
5
for ($j = 0; $j < $codematches[1]; $j++)
    $codematches[1][$j] = code($codematches[1][$j]);

$j = 0;
$f = preg_replace('/\\[code\](.*?)\\[\/code\]/ise', '\$codematches[1][\$j++]', $f);

of zo:
PHP:
1
2
$j = 0;
$f = preg_replace('/\\[code\](.*?)\\[\/code\]/ise', 'code(\$codematches[1][\$j++])', $f);

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
Die laatste lijkt te werken :D:D:D _/-\o_


maar nou wordt er geen preg_replace() meer uitgevoerd die ná de code's komen :S

[ Voor 51% gewijzigd door lennartkocken op 26-05-2006 16:21 ]

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
*kick* O-)

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Iets meer zelf onderzoeken mag ook wel hoor? Er zijn zat open source producten waar je even in de code kan kijken hoe zij het opgelost hebben. Daar leer je meer van dan dat wij het voor je op gaan lossen.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Sowieso is kicken hier niet gewenst voordat je topic uit de topiclisting is verdwenen, en dat is pas na 24 uur. Mensen zien je topic vanzelf wel staan zolang het in de listing staat.
Trouwens:
crisp schreef op zondag 07 mei 2006 @ 13:00:
het is een workaround maar werkt...
Waarom hang je zo vast aan regexps als al vanaf het begin gezegd wordt dat het eigenlijk niet echt een oplossing is? Met een stackbased parser heb je geen van de problemen die je hier probeert aan te kaarten en zò moeilijk is het ook weer niet te implementeren. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

-NMe- schreef op zaterdag 27 mei 2006 @ 13:09:
[...]
Met een stackbased parser heb je geen van de problemen die je hier probeert aan te kaarten en zò moeilijk is het ook weer niet te implementeren. ;)
Ik ga hier toch wat tegengas geven: een stackbased parser is inderdaad niet moeilijk te implementeren, maar om een goede te schrijven is andere koek ;) er zijn wel goede opzets te vinden though

[ Voor 8% gewijzigd door crisp op 27-05-2006 23:35 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

In de tijd die hij nu bezig is met knutselen aan regexps die niet of maar half werken had ie al een heel aardig opzetje af kunnen hebben. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 19:53

orf

Maar met regexen kan het toch ook prima?
Ik heb dat een tijd geleden ingebouwd in een forum

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

orf schreef op zaterdag 27 mei 2006 @ 23:54:
Maar met regexen kan het toch ook prima?
Ik heb dat een tijd geleden ingebouwd in een forum
Je loopt vroeg of laat toch tegen problemen op die met reguliere expressies niet of nauwelijks meer te behappen zijn, zeker als je je tag-ondersteuning gaat uitbreiden.
Klassieke voorbeelden zijn problemen met nestings van dezelfde tags, het afvangen van verkeerde nestings en afhandeling van context-afhankelijke tags (tags die bijvoorbeeld enkel binnen een bepaalde andere tag mogen worden gebruikt of juist niet).

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 19:53

orf

Ik gebruikte voor tags die niet in andere tags gebruikt mochten worden placeholder tags in combinatie met preg_replace_callback(). Werkt op zich prima, binnen de code tags heb ik verschillende high-light parsers.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

orf schreef op zondag 28 mei 2006 @ 00:12:
Ik gebruikte voor tags die niet in andere tags gebruikt mochten worden placeholder tags in combinatie met preg_replace_callback(). Werkt op zich prima, binnen de code tags heb ik verschillende high-light parsers.
Ik zeg ook niet dat het onmogelijk is, enkel dat het vaak erg complex en on-onderhoudbaar wordt (en vaak ook traag).
Op dit moment worstelen we eigenlijk een beetje met hetzelfde probleem op de frontpage waar nog steeds een regexp-based parser wordt gebruikt die tesamen met het feit dat reakties enkel geparsed worden opgeslagen (en dus voor editting teruggeparsed moeten worden) voor steeds meer problemen zorgt... Mettertijd willen we daarvoor ook een stackbased parser gaan inzetten aangezien het gewoonweg niet meer te onderhouden valt.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 19:53

orf

Ik sla ook geparsed op. Bij een beetje volume site vind ik dat naast dubbel opslaan de enige goede methode. Terugparsen is ook niet zo'n probleem, totdat je wijzigingen in je parser aanbrengt. Gewoon één keer bouwen en nooit meer naar kijken. :)

Acties:
  • 0 Henk 'm!

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 20-09 20:35
Ik was niet van plan om nieuwe BBCodes in te bouwen, dus éen keer maken en niet meer naar om kijken...

Kan je dan een voorbeeld geven van wanneer het bij Regexps fout zou gaan?

Goedkoopste hardware


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Zo uit mijn hoofd een probleem waar ik tegenaan liep toen ik ook zoiets heb geprobeerd te maken.
[b][b]test[/b][/b]

[ Voor 5% gewijzigd door AtleX op 29-05-2006 16:28 ]

Sole survivor of the Chicxulub asteroid impact.

Pagina: 1