[PHP] vreemd probleem bij exploden verstuurde data

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 17-09 16:59

Johnny

ondergewaardeerde internetguru

Topicstarter
Ik teskt die ingevoerd wordt op een website automatisch voorzien wordt van HTML opmaak. Ik heb wat rondgestoeid met MSHTML, maar van dingen zoals "<FONT FACE=>" worden we niet echt vrolijk. Tegenwoordig willen we strakke lowercase HTML met opmaak doormiddel van stylesheets.

Ik heb het volgende gemaakt, stukken tekst worden opgesplist per alinea en aan de hand van de inhoud/grootte van de alinea worden er tags toegevoegd.

Alles werkte perfect toen ik in PHP via $text="alle tekst hier"; de opmaak liet maken, maar toen ik het via een formulier liet versturen ging het opeens niet meer. De date wordt wel ontvangen, <br>'s worden toegevoegd maar de tekst wordt niet opgedeeld door de explode() functie. Ik heb al vanalles geprobeerd, ook om \n te vervangen door \r, maar dat is het probleem niet want bij de str_replace() functie gaat alles wel goed.

Wat gaat er mis??

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
//toont alle verstuurde tekst
echo($text);
//horizontale lijn om de scheiding aan te geven
echo("\n\n<hr>\n\n");

//"verboden" tekens omzetten
$text = htmlentities($text]);
//enters vervangen door <br>'s (nl2br() gebruiken we niet want die maakt <br />)
$text = str_replace("\n", "<br>\n", $text);

//breek de tekst in stukken per alinea HIER gaat het fout!
$text = explode("<br>\n<br>\n", $text);

//laat de eerste waarde van de array zien, de tekst is niet opgebroken, alles zit er in!
echo($text[0]);

//weer een horizontale lijn
echo("\n\n<hr>\n\n");

for($i = 0; $i <= count($text); $i++)
    {
//als de alinea langer/gelijk is dan 90 tekens zetten we er <p> tags omheen
    if(strlen($text[$i]) >= 90 || $i == count($text) -1) {$text[$i] = "<p>".$text[$i]."</p>";}
//bestaat de alinea alleen uit dashes? dan is het een horizontale lijn
    elseif(eregi("^[-]{5,70}$", $text[$i])) {$text[$i] = "<hr>";}
//alinea's korter dan 90 tekens zijn een tussenkop, behalve als het de laatste alinea is.
    elseif(strlen($text[$i]) < 90 && strlen($text[$i]) > 5 && $i < count($text) -1) {$text[$i] = "<h2>".$text[$i]."</h2>";}

    }
//zet alles weer achter elkaar en laat het zien.
$text = implode("\n\n", $text);
echo($text);


Een online voorbeeld kun je hier vinden.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wellicht krijg je een \r\n binnen? Makkelijkst is wellicht een split met een regexp te gebruiken ala:
PHP:
1
split("<br>\r?\n?<br>\r?\n?");

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

ik zou dan al beginnen door:
PHP:
1
$text = str_replace("\n", "<br>\n", $text);

te vervangen door:
PHP:
1
$text = preg_replace("/[\r\n]+/", "<br>\n", $text);


maar wat is er eigenlijk mis met <br /> ???

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 17-09 16:59

Johnny

ondergewaardeerde internetguru

Topicstarter
Reactie op ACM:

Ik dacht dat het misschien zou zijn maar helaas, het werkt ook niet :'(

Ik heb deze twee geprobeerd:
PHP:
1
2
$text = split("<br>\r?\n?<br>\r?\n?", $text);
$text = explode("<br>\r\n<br>\r\n", $text);


Edit:

Reactie op crisp:

<br /> = XHTML 1.0
<br> = HTML 4.01

De website is in HTML 4.01.

Deze werkt niet:
PHP:
1
$text = preg_replace("/[\r\n]+/", "<br>\n", $text);


Maar deze wel!!
PHP:
1
$text = str_replace("\r\n", "<br>\n", $text);


Edit2: Is dit nu browser-onafhankelijk?

[ Voor 67% gewijzigd door Johnny op 09-07-2003 01:14 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-09 14:30

DizzyWeb

Ondertiteld

HTML 4.01 Transitional accepteert <br /> gewoon hoor...

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

Johnny schreef op 09 July 2003 @ 01:03:
[...]Edit2: Is dit nu browser-onafhankelijk?

nee, platform afhankelijk: een newline op MAC is \r, in LINUX \n en in windows \r\n
probeer het ander zo:
PHP:
1
$text = preg_replace('/\r\n|\r|\n/', "<br>\n", $text);

en inderdaad <br /> is gewoon ook geldig in HTML4 transitional, enige "nadeel" van nl2br() is dat 'ie alleen <br /> toevoegt, maar de newlines zelf laat staan.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 17-09 16:59

Johnny

ondergewaardeerde internetguru

Topicstarter
DizzyWeb schreef op 09 July 2003 @ 01:16:
HTML 4.01 Transitional accepteert <br /> gewoon hoor...
Hmm.. ja, je hebt gelijk. Ik dacht altijd dat die alle tags die niet af hoefden gesloten te worden in HTML geen / mochten hebben.

Ik gebruik nu de laatste code van crisp, die werkt goed. Ik heb mijn eigen script ook nog een beetje aangepast zodat zowel de eerste en laatste alinea geen horizontale lijn of tussenkop kunnen zijn en het wrekt allemaal perfect nu. _/-\o_

Kan ik eindleijk gaan slapen en hoef ik niet meer de hele nacht door te werken :z

[ Voor 38% gewijzigd door Johnny op 09-07-2003 01:35 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

Verwijderd

Ik dacht dat de Jigsaw validator van W3C hier wel een warning ofzo over geeft.
De validator van htmlhelp.org doet dit in ieder geval niet.
Pagina: 1