webForumDet fria alternativet

Problem med funktion nl2br

7 svar · 366 visningar · startad av lillebror

lillebrorMedlem sedan apr. 20041 597 inlägg
#1

Hej!

Jag använder mig av följande kodstycke på ett ställe. Det ser ut så här:

<?php echo nl2br($array['content']); ?>

Resultatet blir så här:

Detta är ett stort test!\n\ntest\ntest

Varför ersätter inte funktionen nl2br "\n" med <br/>?

tydalMedlem sedan juni 20034 013 inlägg
#2

Funktionen nl2br ska enligt dokumentationen inte ersätta \n med <br />. Den ska stoppa in <br /> före alla \n.

Hur ser ut $array['content'] ut? \n borde ju inte skrivas ut i texten utan det ju bli nyrader istället.

pimmeMedlem sedan sep. 20011 086 inlägg
#3

Problemet kan vara det här: Om du har $str = 'asdf\n\nasdsa'; så tolkas \n som två tecken, dvs \ och n. Om du däremot har $str = "asdf\n\nasdsa"; så tolkas \n som ett tecken och ger därmed en radbrytning.

lillebrorMedlem sedan apr. 20041 597 inlägg
#4

Nu har jag hittat funktionen jag letade efter. Den ser ut så här och ersätter två linefeed ("\n") med <p></p>:

function autop($pee, $br=1) {
	$pee = preg_replace("/(\r\n|\n|\r)/", "\n", $pee); // cross-platform newlines
	$pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
	$pee = preg_replace('/\n?(.+?)(\n\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, including one at the end
	if ($br) $pee = preg_replace('|(?<!</p>)\s*\n|', "<br />\n", $pee); // optionally make line breaks
return $pee;
}

Allting frid och fröjd så långt. Denna kod använder jag för att anropa funktionen:

<?php
echo $array['content'];
echo autop("Fredrik\n\nSäger hej på dig!\n\nDetta var coolt!",1);
echo autop($array['content'],0);
?>

Detta är resultatet av ovanstående anrop och funktion:

 Detta är ett stort test!\n\nFunkar det?\n\nFredrik

Fredrik

Säger hej på dig!

Detta var coolt!

Detta är ett stort test!\n\nFunkar det?\n\nFredrik

$array['content'] innehåller från databasen följande sträng:
"Detta är ett stort test!\n\nFunkar det?\n\nFredrik"

Slutsats: Det verkar fungera bra så länge jag matar funktionen autop med en sträng. Det fungerar inte när jag matar den med innehållet från databasen. Det tycker jag är mycket märkligt. Några tankar om vad som kan vara fel? :OO

tydalMedlem sedan juni 20034 013 inlägg
#5

Det är skillnad på \n och nyrad. Nyrad är ett särskilt tecken som inte går att skriva eftersom det resulterar i en ny rad.

När du skriver "\n" så syftar du på det speciella tecknet som inte går att skriva.

'\n' är däremot tecknena \ och n tillsammans. Det är ingen ny rad och därför hittar inte nyradsfunktionerna detta. Det verkar vara det du har lagt in i databasen.

Om du skulle lagra PHP-strängen "Detta är ett stort test!\n\nFunkar det?\n\nFredrik" i databasen så skulle det lagras som:

"Detta är ett stort test!

Funkar det?

Fredrik"

Men nu verkar du ha lagrat det på något annat sätt eftersom det är '\n' som är lagrat, dvs tecknena \ och n och inte nyrad.

lillebrorMedlem sedan apr. 20041 597 inlägg
#6

Ok. Jag har säkert lagt krokfötter för mig själv. Ponera att jag skriver en artikel i ett formulär och gör ett nytt stycke. Lagras det inte då något tecken för nyrad när den skrivs till databasen? Vad ska jag skriva manuellt i databasen för att det skall bli rätt så att funktionen förstår att den ska skapa en paragraf när den stöter på två nyrader efter varandra?

lillebrorMedlem sedan apr. 20041 597 inlägg
#7

Ja du...vet inte riktigt vad jag fått det där med att lägga till "\n" ifrån. Minns att jag läste det på en sida och i någon tråd och sedan totallurade jag mig själv. Haha :e Det går ju faktiskt att få nytt stycke även när man skriver in text direkt i phpMyAdmin :)

Det löste iaf mina problem...hmmm...att man alltid ska behöva lära sig saker den hårda vägen :birp och go'natt!

fiddlerMedlem sedan juli 20023 617 inlägg
#8

lillebror skrev:

...att man alltid ska behöva lära sig saker den hårda vägen...

Det är då man verkligen kan det sedan! :bire

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)