[PHP/perl] nl2br levert dubbele lege alinea's*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
PHP:
1
print "<td valign='top'>".nl2br($rcList->omschrijving)."<br></td>";

ik gebruik volgende code om een standaard tekst om te zetten naar een beetje geformateerde tekst.
Als ik de nl2br weglaat, komt alle tekst logisch gezien na elkaar..
Maar mét de nl2br, verkrijg ik allemaal dubbele spaties ertussen

code:
1
2
3
4
5
5 fans side blowhole

frontports USB1394

LCD thermometer

hier zouden eigenlijk geen lege alinea's mogen tussenzitten...
Wat kan ik hiertegen doen?

Acties:
  • 0 Henk 'm!

Verwijderd

kijk eens naar je code...

je zegt eerst: nl2br(text) ...
vervolgens plak je er nog een <br> aan vast net voor je </td>

dus logisch dat je 2x een enter krijgt :)

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Nee, die laatste BR, is enkel om nog een lege alinea te verkrijgen juist voor de TD wordt afgesloten.. Het gaat mij om de lege alinea's ertussen..

Acties:
  • 0 Henk 'm!

Verwijderd

ohzo... ik snap t :)
Wat zegt je HTML broncode? Staat daar echt 2x een <br> achter elkaar?

Heb je niet toevallig in je database toch een <br> opgeslagen, of 2x een linefeed?

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
de broncode zegt 1x <br> achter de lijn zelf, en 1x <br> op de lege regel..
maar ik denk dat de fout niet in de php ligt, maar eerder in m'n perl-script, die de omzetting naar xml doet.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

-FoX- schreef op 22 April 2003 @ 13:43:
de broncode zegt 1x <br> achter de lijn zelf, en 1x <br> op de lege regel..
maar ik denk dat de fout niet in de php ligt, maar eerder in m'n perl-script, die de omzetting naar xml doet.
dan pas je je perl script toch aan?
of je delete die lege regels ;)

Acties:
  • 0 Henk 'm!

Verwijderd

dan zit er dus inderdaad in die $rcList->omschrijving 2x een linefeed. (anders zeg PHP m niet om naar 2x een <BR> natuurlijk :))

Dan moet je dus idd. je perl script ff bekijken

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
kan iemand me helpen met dit script, ik heb dit niet helemaal zelf geschreven.. samen met iemand anders, en ik vind de fout niet!!! :(

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
use strict;
use Win32::ODBC;
my $DSN         = "test";
my $XML_DUMP    = "dump.xml";
my $data = new Win32::ODBC("DSN=$DSN");

sub dump_table {
    my ($table) = @_;
    
    print "Select data from $table...\n";
    $data->Sql("SELECT * FROM $table");
    my %fieldnames = $data->FieldNames();
    print "Dumping to XML\n";
    while($data->FetchRow()) {
        print FD_DUMP "\t\<".$table."\>\n";
        foreach my $field (%fieldnames) {
            my $clean_data = $data->Data($field);
            $clean_data =~ s/\&/\&amp\;/g;
            $clean_data =~ s/\</\&lt\;/g;           
            $clean_data =~ s/\>/\&rt\;/g;                       
            if ($field ne '') {
                print FD_DUMP "\t\t\<".$field."\>".$clean_data."\</".$field."\>\n";
            }
        }
        print ".";  
        print FD_DUMP "\t\</".$table."\>\n";
    }
    print "\n";
}
open (FD_DUMP, ">".$XML_DUMP);
print FD_DUMP "\<test\>\n";

dump_table("sorart");
dump_table("groart");

dump_table("artikel");
dump_table("artetik");

dump_table("artatac");

$data->Close();
print FD_DUMP "\</test\>";
close FD_DUMP;

Acties:
  • 0 Henk 'm!

Verwijderd

of als je er niet uit komt met je perl script, een omweg in PHP...
Functie schrijven die de regels uitleest van de output ($rcList->omschrijving)... kijken of de regel leeg is, zo ja: geen <br> neerzetten... en anders wel.

Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
print FD_DUMP "\t\t\<".$field."\>".$clean_data."\</".$field."\>\n";


probeer ns wat er gebeurt als je die \n weghaalt aan t einde van de regel?
(long shot, want dat zet alleen een enter achter je xml entiteit)

Acties:
  • 0 Henk 'm!

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 16:46

RM-rf

1 2 3 4 5 7 6 8 9

als je kijkt naar de uitgevoerde code weet je eerder waar de fout ligt,
retoruneert nl2br twee <br>'s staan er twee newline tekens (mogenlijk ligt dat ook aan de content-type: windows gebruikt \n\r voor een linebreak, beiden zijn een newline, mogelijk kun je in een configuratie, of extra flags aan de functie zijn gedrag verder definieren)

wil je bij 2 newline-tekens alsnog 1 <br /> hebben, moet je eerst dubbelle /n verwijderen, met een preg_replace(/[\n\r]*/gi, "\n")

heb je in je code gewoon 1 <br /> maar zie je een grotere regelafstand, moet je gewoon kijken naar je html, mogelijk een grotere css-definitie van line-height?

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
uitvoerende code:
code:
1
2
3
4
5
6
blowhole<br />
<br />
frontports USB1394<br />
<br />
LCD thermometer<br />
<br />


Zo staan ze in de xml:
code:
1
2
3
4
5
6
7
8
<e_omschrn>blowhole

frontports USB1394

LCD thermometer

</e_omschrn>
        <e_regel1></e_regel1>

Acties:
  • 0 Henk 'm!

  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 12-09 09:30
code:
1
$clean_data =~ s/\>/\&rt\;/g;


ik kan me vergissen hoor, maar is het niet > ?? (nu dus &rt;)

en volgens mij zit er geen extra enter in de XML, dus zou het in de database moeten zitten. Probeer daar eens in te kijken ofzo?

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

_BRAINLESS schreef op 22 April 2003 @ 14:00:
code:
1
$clean_data =~ s/\>/\&rt\;/g;


ik kan me vergissen hoor, maar is het niet > ?? (nu dus &rt;)

en volgens mij zit er geen extra enter in de XML, dus zou het in de database moeten zitten. Probeer daar eens in te kijken ofzo?
aangezien React niet mee werkt:
&gt;

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
code:
1
my $clean_data = $data->Data($field);


Wellicht daaronder zetten:

code:
1
chomp($clean_data);


Dit verwijderd newlines die misschien in je database zitten. Of vervang dubbele newlines in de $clean_data:

code:
1
2
3
$clean_data~= s/\n\r/\n/g;
//of
//$clean_data ~= s/\n\n/\n/g;


Tis maar een gok, maar ik hoop dat je er wat aan hebt

[ Voor 22% gewijzigd door Morrar op 22-04-2003 14:28 ]


Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
waarom moet ik dan eerst die chomp doen?
chomp is toch om de "returns" op de einde van de regel weg te strippen?! :? ben niet zeker

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
Ja chomp is idd om de regeleindes aan het einde van een regel weg te halen.

Ik dacht ff dat die extra newlines tussen de velden zaten maar ze zaten ook in de velden zelf. Daarom is die substitute eigenlijk de oplossing denk ik. Wou ff te snel reageren :)

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Ook heb ik het probleem dat sommige velden worden afgekapt op 35char's...

code:
1
POWENEEG301P-VE(    Enermax SilentPlus 300 (with adj fa

zou dit aan de ODBC-driver kunnen liggen?

Zo is het systeem (voor de onlineshop):
DBF --> XML --> MySQL

Acties:
  • 0 Henk 'm!

Verwijderd

Is de string al afgekapt in de XML file?

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
ja, in de XML-file is hij ook al afgekapt

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Morrar schreef op 22 April 2003 @ 14:24:
code:
1
my $clean_data = $data->Data($field);


Wellicht daaronder zetten:

code:
1
chomp($clean_data);


Dit verwijderd newlines die misschien in je database zitten. Of vervang dubbele newlines in de $clean_data:

code:
1
2
3
$clean_data~= s/\n\r/\n/g;
//of
//$clean_data ~= s/\n\n/\n/g;


Tis maar een gok, maar ik hoop dat je er wat aan hebt
Heb ik uitgeprobeerd.. maar geen van beide werkt! :(

pfff, nog iemand enige ideeën?????

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Kan er voor de rest niemand nog overige foutjes vinden in het perl-script?

Of denkt iemand anders dat het op een ander ogenblik misgaat?
Ook het feit van de afgekapte productnamen en code's vind ik vreemd. Zou het door de ODBC-driver komen?

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
Het afkap-probleem ligt iig niet aan Perl ofzo, dus dat zal inderdaad wel eens met de ODBC kunnen liggen.

Het probleem van de dubbele regels moet wel op te lossen zijn met Perl, want dat zit ook al in de gedumpte XML. Ik had overigens wel een foutje in mijn code: het moet $clean_data =~ s/\n\n/\n/g; zijn. Ik weet niet of je daar ook al achter gekomen was...

Anders zou je de XML ff in een hex editor moeten gooien om te kijken wat er nou helemaal aan regels tussen zit (0A = newline = \n, 0D = carriage return = \r)

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Ik heb de XML met een hex-editor bekeken.
Tussen die lege lijnen stond: 0D 0D 0A dus nu heb ik volgende perl-script:

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
#! /usr/bin/perl
use strict;
use Win32::ODBC;
my $DSN     = "test";
my $XML_DUMP    = "dump.xml";
my $data = new Win32::ODBC("DSN=$DSN");

sub dump_table {
    my ($table) = @_;
    
    print "Select data from $table...\n";
    $data->Sql("SELECT * FROM $table");
    my %fieldnames = $data->FieldNames();
    print "Dumping to XML\n";
    while($data->FetchRow()) {
        print FD_DUMP "\t\<".$table."\>\n";
        foreach my $field (%fieldnames) {
            my $clean_data = $data->Data($field);
            chomp($clean_data);
            $clean_data =~ s/\&/\&amp\;/g;
            $clean_data =~ s/\</\&lt\;/g;           
            $clean_data =~ s/\>/\&gt\;/g;   
            $clean_data =~ s/\r\r\n/\n/g;
                    
        if ($field ne '') {
print FD_DUMP "\t\t\<".$field."\>".$clean_data."\</".$field."\>\n";
        }
        }
        print ".";  
        print FD_DUMP "\t\</".$table."\>\n";
    }
    print "\n";
}
open (FD_DUMP, ">".$XML_DUMP);
print FD_DUMP "\<test\>\n";

dump_table("sorart");
dump_table("groart");

dump_table("artikel");
dump_table("artetik");

dump_table("artatac");

$data->Close();
print FD_DUMP "\</test\>";
close FD_DUMP;

Maar nog steeds bevinden er zich lege lijnen tussen de artikelomschrijvingen :( :( :(

Is er dan nog echt iets dat ik over het hoofd zie :? ??

[ Voor 16% gewijzigd door -FoX- op 25-04-2003 16:56 ]


Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
*kickje*

niemand die me het juiste duwtje in de rug kan geven?

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
Hmmz dit begint erg vaag te worden...

Werken die andere substitutes wel? Wordt bijvoorbeeld een ? wel in een & amp; omgezet? En weet je zeker dat het 0D 0D 0A is? 0D 0A 0D 0A zou natuurlijk waarschijnlijker zijn. Dat zou ook verklaren waarom s/\r\r\n/\n/g niet werkt...

Je kan ook ff een

if($clean_data =~ /\r\r\n/) { print "woei\n"; }

doen om te zien of er iets gematched wordt...

Dat zijn eigenlijk wel een beetje mijn laatste gokjes :/

Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
in php kan ik het in ieder geval oplossen met:
PHP:
1
2
$omschrijving = str_replace("\r\r\n","<br>",$rcList->omschrijving);
print "<td valign='top'>".nl2br($omschrijving)."<br></td>";

dus in principe moet het in perl ook op te lossen zijn met volgende lijn:
code:
1
$clean_data =~ s/\r\r\n/\n\;/g;

Dit is echter nog steeds niet het geval...
Wat is echter dan nog het grote verschil tussen de vorige regel code, en deze?
code:
1
$clean_data =~ s/\r\n/\n/gs;
Pagina: 1