[php] tabel in UBB maakt te grote whitespace erboven?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hi

Ik ben bezig om m'n ubbparser aan te passen, waarbij dus ook tabellen horen. Het converteren werkt prima, maar ik heb last van 1 probleem: Tussen de tabel en content erboven is er een te grote whitespace. Een voorbeeld:

Linkje.

M'n parsecode:
PHP:
1
2
3
4
5
<?php
            $out = preg_replace('/\\[table\](.*?)\\[\/table\]/is', '<table cellspacing="0" cellpadding="1" style="width: ' . $tabel_breedte . ';border: 1px solid #000000;border-top: 1px solid #000000; border-right: 0px; float: left;">\1</table>', $out); 
            $out = preg_replace('/\\[tr\](.*?)\\[\/tr\]/is', '<tr>\1</tr>', $out); 
            $out = preg_replace('/\\[td\](.*?)\\[\/td\]/is', '<td style="border-right: 1px solid #000000;">\1</td>', $out); 
?>


De html(van de output op het voorbeeld dus):
code:
1
2
3
4
5
6
7
8
9
<strong>Game info:</strong><br />
<br />
<table cellspacing="0" cellpadding="1" style="width: 580px;border: 1px solid #000000; border-right: none;"><tr><td style="border-right: 1px solid #000000;"> Developer: </td><td style="border-right: 1px solid #000000;"> Paramount&nbsp;&nbsp;</td></tr><br />
<tr><td style="border-right: 1px solid #000000;"> Producer: </td><td style="border-right: 1px solid #000000;"> Electronic Arts </td></tr><br />
<tr><td style="border-right: 1px solid #000000;"> Genre: </td><td style="border-right: 1px solid #000000;"> Action, Adventure </td></tr><br />

<tr><td style="border-right: 1px solid #000000;"> Platform: </td><td style="border-right: 1px solid #000000;">PC</td></tr><br />
<tr><td style="border-right: 1px solid #000000;"> Multiplayer: </td><td style="border-right: 1px solid #000000;">No</td></tr><br />
<tr><td style="border-right: 1px solid #000000;"> System requirements: </td><td style="border-right: 1px solid #000000;"> Windows 2000/XP , Pentium 4 1,4Ghz , 256Mb Ram , 64MB videocard , Dx9C compatible sound card 2x DVD Rom , 5GB HD-space&nbsp;&nbsp;</td></tr> </table>


En de ubb:
code:
1
2
3
4
5
6
[table][tr][td] Developer: [/td][td] Paramount  [/td][/tr]
[tr][td] Producer: [/td][td] Electronic Arts [/td][/tr]
[tr][td] Genre: [/td][td] Action, Adventure [/td][/tr]
[tr][td] Platform: [/td][td]PC[/td][/tr]
[tr][td] Multiplayer: [/td][td]No[/td][/tr]
[tr][td] System requirements: [/td][td] Windows 2000/XP , Pentium 4 1,4Ghz , 256Mb Ram , 64MB videocard , Dx9C compatible sound card 2x DVD Rom , 5GB HD-space  [/td][/tr] [/table]


Iemand enig idee hoe ik die white space eruit kan strippen of kan vermijden?

Bij voorbaat dank

[ Voor 48% gewijzigd door Verwijderd op 31-05-2006 19:08 ]


Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 20:37
je output een <br /> aan het eind van iedere regel, omdat deze niet bínnen een cell staan verschijnen ze bóven de tabel, dus linebreaks in je input die binnen een [table]-tag staan moet je niet parsen naar <br />

[ Voor 34% gewijzigd door OnTracK op 31-05-2006 19:12 ]

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Enig idee hoe die te vermijden? :) Want op het gebied van reguliere expressies ben ik nogal noobish :/

[ Voor 63% gewijzigd door Verwijderd op 31-05-2006 19:15 ]


Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 20:37
Nee, daar heb ik ook niet echt verstand van. Het zit dus niet in je code voor je tabel, maar in het gedeelte voor de gewone tekst

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Je zal wel ergens een overbodige nl2br() hebben staan. Dit probleem heeft niks met je regexp te maken.

'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!

Verwijderd

Topicstarter
Ik heb 1 nl2br(); staan, voor de code. Maar die heb ik nodig, wil ik m'n text deftig kunnen invoeren... Die dus weglaten is geen optie vermoed ik :)

[ Voor 3% gewijzigd door Verwijderd op 31-05-2006 20:16 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Dan zul je na die nl2br alle voorkomens van [/tr].*<br>.*[tr] moeten vervangen door [/tr][tr], maar dat gaat niet echt lekker waterdicht werken ben ik bang.

[ Voor 5% gewijzigd door NMe op 31-05-2006 20:18 ]

'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!

Verwijderd

Topicstarter
Die werkt inderdaad niet :'(

Edit: zou er geen manier zijn om die tabel(len) in een andere var (array dus) op te vangen, en dan die nl2br(); over de output laten lopen en dan terug de strings aan elkaar hangen?

[ Voor 78% gewijzigd door Verwijderd op 31-05-2006 20:34 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

preg_match_all gebruiken. Maar dan kom je al heel erg snel in de buurt van een eigen parser en dan kun je net zo goed die regexps compleet achterwege laten en alles handmatig parsen. :)

Dit omdat je natuurlijk nog wel newlines moet omzetten naar <br>'s. Als dat niet hoeft, dan is het een stuk makkelijker.

'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: 00:44

orf

Voor zulk soort dingen kun je placeholders gebruiken.
Voorbeeldje met highlight_string (binnen code tags wil je ook geen ubb parsing):

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

function highlight_code($matches){
    // in $hl_array worden de highlighted codes tijdelijk opgeslagen
    global $hl_array;

    // $hl_num is het nummer die deze code krijgt
    $hl_num = count($hl_array);

    // code in array en return van placeholder
    $hl_array[$hl_num] = highlight_string($matches[1], true);

    return '{{HL_'.$hl_num.'}}';
}


function encode($message){

  global $hl_array;

  $message = str_replace('{{HL_', '{{ HL_', $message);
  $message = preg_replace_callback("/\\[CODE\][\n\r]*(.*?)\\[\/CODE\]/is",'highlight_code', $message);

  $message = htmlspecialchars($message);
  $message = nl2br($message);
  $message = preg_replace('#\\[([bisu])\](.*?)\\[/\\1\]#Si', "<$1>$2</$1>", $message);
    // andere ubb

  foreach ($hl_array as $hl_num => $code){    

    $message = str_replace('{{HL_'.$hl_num.'}}', $code, $message);
  }

  return $message;

}


?>


Eerst de code tags omzetten naar de placeholders, dan de overige preg_replaces, nl2br, htmlspecialchars, daarna pas de code daadwerkelijk terugzetten.

[ Voor 27% gewijzigd door orf op 31-05-2006 21:17 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:06

crisp

Devver

Pixelated

oeh, table-UBB met een regexp parser; da's fun vooral met tables in tables en allerlei invalid constructies die uiteindelijk invalid HTML opleveren :)

serious; het *is* mogelijk maar echt vrolijk ga je niet worden. Kleine opzet (en bij lange na nog niet perfect):

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
$input = preg_replace_callback('/\\[table\]((([^[]|\\[(?!\/?table))*|(?R))*)\\[\/table\]/i', 'maketable', $input);
function maketable($matches)
{
    $input = trim($matches[1]);

    if ($input)
    {
        //-- process tablerows
        $input = preg_replace_callback('/\s*\\[tr\]((([^[]|\\[(?!\/?tr))*|(?R))*)\\[\/tr\]\s*/i', 'maketr', $input);
    
        return '<table border="1">' . $input . '</table>';
    }

    //-- nothing to do; keep tags
    return $matches[0];
}
function maketr($matches)
{
    $input = trim($matches[1]);

    if ($input)
    {
        //-- process tablecells
        $input = preg_replace_callback('/\s*\\[td\]((([^[]|\\[(?!\/?td))*|(?R))*)\\[\/td\]\s*/i', 'maketd', $input);
    
        return '<tr>' . $input . '</tr>';
    }

    //-- nothing to do; keep tags
    return $matches[0];
}
function maketd($matches)
{
    $input = trim($matches[1]);

    if ($input)
    {
        //-- process tables within cells
        $input = preg_replace_callback('/\\[table\]((([^[]|\\[(?!\/?table))*|(?R))*)\\[\/table\]/i', 'maketable', $input);
    
        return '<td>' . $input . '</td>';
    }

    //-- nothing to do; keep tags
    return $matches[0];
}


tijd voor een stackbased parser?

[ Voor 3% gewijzigd door crisp op 31-05-2006 21:33 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar zou het niet op te lossen zijn in de expressie zelf, door bvb \n ofzo te strippen? (ik kan natuurlijk ook die nl2br(); moven naar een later point, dat is n/p)

Dat zou dan iets makkelijker zijn :p

Momenteel ben ik me even aan het verdiepen in crisp zijn functie :)

[ Voor 26% gewijzigd door Verwijderd op 31-05-2006 22:15 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Wil je binnen tabelcellen geen enters kunnen gebruiken dan? ;)

'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!

Verwijderd

Topicstarter
Jawel, maar die enters staan erachter, en ik dacht door iets in m'n regexp te zetten zoals (\<br \/\> {0}) ofzo achter bvb [/tr], dat dat misschien kon helpen? Anyway ik ga d'r morgen op verder staren, nu ga ik :z. Bedankt alvast

[ Voor 9% gewijzigd door Verwijderd op 31-05-2006 22:36 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Als je zin hebt in het uitvogelen van de perfecte lookahead/lookbehind assertion (waar crisp er al een aantal van gebruikt) dan kan het wel. Veel succes. ;)

'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!

Verwijderd

Topicstarter
Zou ik dan iets zoals dit kunnen doen:

PHP:
1
$out = preg_replace("#\\[table\](.*?)\\[\/tr\](.*?)\n(.*?)\\[tr\](.*?)\\[\/table\]#is", "[table]\1[/tr]\2\3[tr]\4[/table]", $out);


? Ik weet dat het een verkeerde regex is maar ik ben er dan ook nogal een noob in. (<br />) (ook met slashes) werkt ook niet. Anders nog enige ideeën?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Opgelost. Ik maakte het gewoon te moeilijk! :P Dit deed ik voor de tr-replace:
code:
1
            $out = preg_replace("#\\[\/tr]<br />#is", "[/tr]", $out);


Iedereen alsnog bedankt voor het meezoeken naar de oplossing :)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:06

crisp

Devver

Pixelated

tsja, maar kan je garanderen dat je altijd valide HTML genereerd? kan je omgaan met nested tables? dwing je ook af dat een table tenminste 1 tablerow moet bevatten, en een table-row weer tenminste 1 tablecell? etcetera etcetera
kortom: denk je zelf ook niet dat dit soort zaken implementeren mbv reguliere expressies eigenlijk ondoenlijk is? Zelfs in mijn toch al uitgebreide voorbeeld kan ik daar al niet aan voldoen...

ter illustratie, wat bakt jouw parser hier van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[table][/table]
[tr][/tr]
[td][/td]

[table]tralala[/table]
[table][tr]tralala[/tr][/table]

[table][table][/table][/table]
[tr][tr][/tr][/tr]
[td][td][/td][/td]

[table][tr][td][/tr][/td][/table]

[table]
    heu?[tr]waa?
        [td]tralala
            [table][tr][td]moeh[/td][/tr][/table]
            stout:[/td][/table][/tr]
            foo
        [/td]
    heh?[/tr]oef!
[/table]

? :P

[ Voor 8% gewijzigd door crisp op 02-06-2006 22:48 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Verwijderd schreef op vrijdag 02 juni 2006 @ 20:48:
Opgelost. Ik maakte het gewoon te moeilijk! :P Dit deed ik voor de tr-replace:
code:
1
            $out = preg_replace("#\\[\/tr]<br />#is", "[/tr]", $out);


Iedereen alsnog bedankt voor het meezoeken naar de oplossing :)
Dat zei ik al veel eerder in dit topic? :) [rml]-NMe- in "[ php] tabel in UBB maakt te grote whites..."[/rml]

Hoe dan ook, zoals crisp al zegt: je moet hier geen regexps voor wìllen gebruiken. Ze zijn er simpelweg niet voor bedoeld.

'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!

Verwijderd

crisp schreef op vrijdag 02 juni 2006 @ 22:46:
dwing je ook af dat een table tenminste 1 tablerow moet bevatten, en een table-row weer tenminste 1 tablecell? etcetera etcetera
Een table zonder tablerows, of een tablerow zonder tablecells is volstrekt valide. Zinloos, maar wel valide.
Maar je voorbeelden waren wel duidelijk en hilarisch! :)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:06

crisp

Devver

Pixelated

Verwijderd schreef op zaterdag 03 juni 2006 @ 00:10:
[...]

Een table zonder tablerows, of een tablerow zonder tablecells is volstrekt valide. Zinloos, maar wel valide.
Dat moet je niet zeggen tegen iemand die specificaties uit z'n hoofd kent en DTD's kan opdreunen terwijl 'ie slaapt :P
http://www.w3.org/TR/html4/sgml/dtd.html:
HTML:
1
2
3
4
<!ELEMENT TABLE - -
     (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
<!ELEMENT TBODY    O O (TR)+           -- table body -->
<!ELEMENT TR       - O (TH|TD)+        -- table row -->

Oftewel; een TABLE moet een TBODY bevatten - TBODY is echter implied; de start- en end-tags zijn optional -, een TBODY moet minstens een TR bevatten en een TR moet minstens een TH of TD bevatten (end-tags van TR, TD en TH zijn overigens weer optional, start-tags niet)

[ Voor 4% gewijzigd door crisp op 03-06-2006 00:20 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar als je het niet via regexes doet, hoe doe je het dan in je eigen functies, zoals bvb hier op got? (Als ik dat tenminste mag vragen :+)

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.

Pagina: 1