[php/regex] UBB-code <-> HTML-code

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

  • BobDay
  • Registratie: December 2001
  • Laatst online: 11-08-2025
voor een project waar ik aan werk heb ik een hele set aan UBB-codes geschreven.
Hiervoor heb ik ook de [html]-tag waarmee geswitched kan worden tussen UBB-modus en HTML-modus.

Alle code tussen [html] en [/html] moet genegeerd worden door de regex. De omgezette code wil ik opslaan in de database.

met de functie TEKSTomzetten moet het volgende gebeuren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Algemeen:
* [html] omzetten in <!-- open_html -->
* [/html] omzetten in <!-- sluit_html -->

In UBB-modus:
* UBB code opzetten naar HTML
* newlines (\n) omzetten naar <br>
* htmlspecialchars($tekst)

In HTML-modus:
* Géén UBB-codes omzetten
* ...eigenlijk dus met rust laten!
met de functie TEKSTterugzetten moet bovenstaande weer ongedaan worden gemaakt.

hier mijn code:
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
<?php
function TEKSTomzetten($tekst)
{
    $patterns = array();
    $replacements = array();

    $patterns[0] = "!^(.*?)(?=(\\[html\]))!Amesi";
        $replacements[0] = "UBBnaarHTML('\\1')";
    $patterns[1] = "!\\[/html\](.*?)\\[html\]!Amesi";
        $replacements[1] = "'[/html]'.UBBnaarHTML('\\1').'[html]'";
    $patterns[2] = "!(?=\\[/html\])(.*?)$!Amesi";
        $replacements[2] = "UBBnaarHTML('\\1')";
    $patterns[3] = "!\\[html\]!msi";
        $replacements[3] = "<!-- open_html -->";    
    $patterns[4] = "!\\[/html\]!msi";
        $replacements[4] = "<!-- sluit_html -->";
    
    $tekst = preg_replace($patterns, $replacements, $tekst);

    return $tekst;
}

function UBBnaarHTML($tekstblok)
{
    $tekstblok = stripslashes($tekstblok);
    
    $patterns = array();
    $replacements = array();
    
    $patterns[0] = "!\\[b\](.*?)\\[/b\]!msi";
        $replacements[0] = '<b>\1</b>';
    //[knip...]
    $patterns[24] = "!\\[hr=([0-9]{1,3}),(left|center|right){1},(.*?)\]!msi";
        $replacements[24] = '<hr width="\1%" align="\2" color="\3">';

    $tekstblok = preg_replace($patterns, $replacements, $tekstblok);
    
    return $tekstblok;
}

function TEKSTnaarHTML($tekstblok)
{
    // undo htmlspecialchars()
    $tekstblok = str_replace( "&lt;"        , "<"       ,$tekstblok );
    $tekstblok = str_replace( "&gt;"        , ">"       ,$tekstblok );
    $tekstblok = str_replace( "&amp;"   , "&"       ,$tekstblok );
    $tekstblok = str_replace( "&quot;"  , "\""  ,$tekstblok );
    $tekstblok = str_replace( "'"   , "'"       ,$tekstblok );

    return $tekstblok;
}

function HTMLnaarUBB($tekstblok)
{
    $tekstblok = stripslashes($tekstblok);
    
    $patterns = array();
    $replacements = array();
    
    $patterns[0] = '!<b>(.*?)</b>!msi';
        $replacements[0] = '[b]\1[/b]';
    //[knip...]
    $patterns[20] = '![img]"(.*?)"[/img]!msi';
        $replacements[20] = '[img=\2,\3]\1[/img]';

    $tekstblok = preg_replace($patterns, $replacements, $tekstblok);
    
    return $tekstblok;
}
?>

Voorbeeldje (zonder nl2br):
PHP:
1
2
3
4
5
6
7
8
9
10
$aText = <<<EOD
[s]Mij wel doorstrepen[/s][html] [b]Mij niet vet maken en tags weergeven[/b][/html][i]Mij wel cursief maken[/i] [html]
<b>[b]wel vet en ubb tags weergeven[/b]</b>[/html]
[u]mij onderstrepen[/u][html] <u>niet onderstrepen en html-codes
weergeven</u> [s]mijn niet doorstepen[/s][/html]
[b]vett[/b]
[sup]buiten[/sup]
EOD;

$aText = TEKSTomzetten($aText);

uitkomst (underscore wegdenken):
code:
1
2
3
4
5
6
[s]Mij wel doorstrepen[s]
[_b]Mij niet vet maken en tags weergeven[_/b][_i]Mij wel cursief maken[_/i]
<b>[_b]wel vet en ubb tags weergeven[_/b]</b>
[_u]mij onderstrepen[_/u]
[u]niet onderstrepen en html-codes weergeven[/u]
[_s]mijn niet doorstepen[_/s] [_b]vett[_/b] [_sup]buiten[_/sup]


Mocht ik (mbv jullie) deze code werkend krijgen dan zal ik er een knip-klare versie hier van achterlaten!

[ Voor 0% gewijzigd door BobDay op 28-08-2002 14:24 . Reden: code opmaak ]

43% of all statistics are worthless


Verwijderd

Ik weet niet zeker of dit de mooiste oplossing is, maar met preg_split kun je de [html]-blokken en de niet-[html]-blokken opsplitsen naar een array. Met een foreach()-loop kun je dan checken of een array-onderdeel begint met [html], en zo nee, dan kun je UBBnaarHTML() eroverheen gooien.

  • BobDay
  • Registratie: December 2001
  • Laatst online: 11-08-2025
' = single quote (')
In het voorbeeldje staan meer codes omheen:

43% of all statistics are worthless


  • BobDay
  • Registratie: December 2001
  • Laatst online: 11-08-2025
Nieko: ik zal eens kijken of ik dan de gespitste blokken weer in de goede volgorde kan samenvoegen

43% of all statistics are worthless