webForumDet fria alternativet

dela upp en text på flera sidor.

PHP

25 svar · 792 visningar · startad av visslaren

Medlem sedan juli 20011 222 inlägg
Frågan#1

Håller på med en wapsida till spelbasen.nu. man ska kunna läsa texter på sidan men det blir för mycket att ha hela på en enda sida. så jag börjad med ett script som delar upp texten på flera sidor och lägger till bläddra knappar nedanför.
fungerar tyvärr inte perfekt. jag körde strlen på texten och delade upp i 4 vilket ledde till längder på t.ex. 1000.75 tecken osv. och så la den bara på nästa del på första osv när man bläddrade.
Det som jag skulle vilja att den gör är att bläddra felfritt samt även bryta utanför taggar. texterna har <b></b> runt rubriker och bryter den mellan dem så blir det fel i koden då wml inte klarar av oavslutade taggar.

Nån som har någon ide på hur detta kan göras? Är inte så bra på såna här saker :)

Koden jag gjort. ganska rörig dock, men jag har märkt upp sidbrytarkoden med kommentarer

print "<wml>\n";
print "<card id=\"nyhet\" title=\"wap.spelbasen.nu\">\n";
print "<p>\n";
print "<img src=\"grafik/logo.wbmp\"  alt=\"SpelBasen.Nu\" />\n";
print "<br />\n";
$sql="SELECT title, samman, content FROM art_rec WHERE id='$io'"
or die(mysql_error());
$result = mysql_query("$sql")
or die(mysql_error()); 
$rad=mysql_fetch_row($result);

//byter ut diverse saker.
$content = str_replace("<br />","<br />",$rad[2]);
$content = str_replace("<BR />","<br />",$rad[2]);
$content = str_replace("\n","<br />",$rad[2]);
$content = str_replace("<br>","<br />",$content);
$content = str_replace("<BR>","<br />",$content);
$content = str_replace("<B>","<b>",$content);
$content = str_replace("</B>","</b>",$content);
$content = str_replace("</p>","",$content);
$content = str_replace("<p>","",$content);
$content = str_replace("</P>","",$content);
$content = str_replace("<P>","",$content);

//dela upp text
$txt_len = strlen($content);
$part = $txt_len/4;
if(!$page) {
$content= substr($content, 0, $part); 
}
elseif ($page==$part) {
$content= substr($content, part, ($part*2)); 
}
elseif ($page==($part*2)) {
$content= substr($content, part, ($part*3));
}
elseif ($page==($part*3)) {
$content= substr($content, part, ($part*4));
}
else {
$content= substr($content, 0, $part);
}

print "<b><u>&#34;".$rad[0]."&#34;</u></b><br/>\n";
print $rad[1]."<br /><br />\n";
print $content."<br />\n";

//fixa länkningen
if(!$page) {
print "<a href=\"recension.php?page=".$part."&amp;io=".$io."\">» Nästa sida</a><br />\n";
}
elseif ($page==$part) {
$cnt = $part*2;
print "<a href=\"recension.php?page=".$cnt."&amp;io=".$io."\">» Nästa sida</a><br />\n";
print "<a href=\"recension.php?io=".$io."\">« Förra sidan</a><br />\n";
}
elseif ($page==($part*2)) {
$cnt = $part*3;
$cnt2 = $part*2;
print "<a href=\"recension.php?page=".$cnt."&amp;io=".$io."\">» Nästa sida</a><br />\n";
print "<a href=\"recension.php?page=".$cnt2."&amp;io=".$io."\">« Förra sidan</a><br />\n";
}
elseif ($page==($part*3)) {
$cnt = $part*4;
$cnt2 = $part*3;
print "<a href=\"recension.php?page=".$cnt."&amp;io=".$io."\">» Nästa sida</a><br />\n";
print "<a href=\"recension.php?page=".$cnt2."&amp;io=".$io."\">« Förra sidan</a><br />\n";
}
else {
print "<a href=\"recension.php?page=".$part."&amp;io=".$io."\">» Nästa sida</a><br />\n";
}

print "<br /><br />\n";
print "<a href=\"nyheter.php\">« Tillbaka</a>\n";
print "</p>\n";
print "</card>\n";
print "</wml>\n";
Medlem sedan juli 20013 378 inlägg
#2

Måste alla sidor vara lika stora?

Klura annars lite på om det finns någon tagg som du kan "explodera" resultatet från (t.ex. en tagg som du *vet* alltid är en rubrik ;) ) och bygg sidbrytningarna från det (rad för rad i den resulterande arrayen.

Detta är en (quick-n-dirty) variant på det temat...
Det går med *största* sannolikhet att göra detta snyggare, men detta funkar för mig ;)

<?php
$sida_text="<h2>ett</h2><p>stycke ett</p><h2>Två</h2><p>stycke två</p><h2>Tre</h2><p>stycke tre</p>";
$resultatet = preg_split("(<h2>)", $sida_text, -1, PREG_SPLIT_NO_EMPTY); 
for($i=0,$n=count($resultatet); $i<$n; $i++) {
	echo htmlentities("<h2>".$resultatet[$i])."<br/>";
}
?>

Att resultatet skrivs ut som "<h2>".$resultatet[$i] för varje "del" beror på att explode tuggar i sig avgränsarsträngen ("delimitern") ;)
htmlentities är med i exemplet bara för att taggarna skall skrivas ut, och inte "köras" av webbläsaren ;)

Red: Men det var då själve §jr ....
I preg_split("(<h2>)" ... ) skall (<h2>) vara *utan* mellanslag mellan > och ) - men jag förstår mig inte på hur man tar sig förbi autoformateringen som lägger till detta extra mellanslag när inlägget visas som verkar finnas här på wF :x

Medlem sedan juli 20011 222 inlägg
#3

Inte kunnat testa själv pga att wapnätet verkar dött här i arboga för tillfället och opera kommer heller ej in på wappen här. men en kompis kollade och tydligen visas hela texten samt ett felmeddelande på rad 57; "unsupported operand types". har markerat raden.
Problemet ligger förmodligen i den kod jag försökt anpassa för att bläddra. har använt en kod som jag skrivit för att bläddra på flera sidor då materialet loopas ut från flera poster. lagt av mig så mycket nu på sista tiden. inte pillat php på ett tag :(

Några ideer? :)

//dela text
$resultatet = preg_split("(<b>)", $content, -1, PREG_SPLIT_NO_EMPTY); 
for($i=0,$n=count($resultatet); $i<$n; $i++) {
   ${"content_".$i} = htmlentities("<b>".$resultatet[$i])."<br/>";
}

//dela upp text på olika sidor
if (isset($posts)) {
}
else {
$posts=0;
}

print ${"content_".$posts}."<br />\n";

$page = 0;
$tmp = $posts;
$summa=$resultatet-$tmp; <--- rad 57
$tmpy=$tmp-$page;
$tmpx=$tmp+$page;
if ($resultatet>$page) {
if ($summa<=$page) {
echo "<a href=" . $PHP_SELF . "?posts=" . $tmpy . ">Bakåt</a>";
}
elseif ($tmpx>$page) {
echo "<a href=" . $PHP_SELF . "?posts=" . $tmpy . ">Bakåt</a><br /><a href=" . $PHP_SELF . "?posts=" . $tmpx . ">Nästa</a>";
}elseif ($summa>$page) {
echo "<a href=" . $PHP_SELF . "?posts=" . $tmpx . ">Nästa</a>";
}
}
Medlem sedan juli 20013 378 inlägg
#4

Hmm... $summa=$resultatet-$tmp; <--- rad 57

$resultatet - är en array med ett antal text-delar...
$tmp - är en siffra....
;)

BTW:
Du kan antagligen köra med

${"content_".$i} = "<b>".$resultatet[$i];

istället för ${"content_".$i} = htmlentities("<b>".$resultatet[$i])."<br/>"; ;)

Medlem sedan juli 20011 222 inlägg
#5

Here we go again... :)
ändrade resultatet till i istället och då försvann det felet samt att första delen av texten visas. men nu blir det fel på taggen "</p>" ("mismatched tag") på grund av att <b> blir oavslutad. tog bort htmlentities då det tog bort åäö och skrev ut varenda liten tag som fanns i texten :)
"Bläddraren" fungerar heller inte. och jag har hittills inte lyckats lista ut vad som bör göras för att ordna den.

ideer? :)

print "<p>\n";
print "<img src=\"grafik/logo.wbmp\"  alt=\"SpelBasen.Nu\" />\n";
print "<br />\n";
$sql="SELECT title, samman, content FROM art_rec WHERE id='$io'"
or die(mysql_error());
$result = mysql_query("$sql")
or die(mysql_error()); 
$rad=mysql_fetch_row($result);

$content = str_replace("<br />","<br />",$rad[2]);
$content = str_replace("<BR />","<br />",$rad[2]);
$content = str_replace("\n","<br />",$rad[2]);
$content = str_replace("<br>","<br />",$content);
$content = str_replace("<BR>","<br />",$content);
$content = str_replace("<B>","<b>",$content);
$content = str_replace("</B>","</b>",$content);
$content = str_replace("</p>","",$content);
$content = str_replace("<p>","",$content);
$content = str_replace("</P>","",$content);
$content = str_replace("<P>","",$content);

print "<b><u>&#34;".$rad[0]."&#34;</u></b><br/>\n";
print $rad[1]."<br /><br />\n";

//dela text
$resultatet = preg_split("(<b>)", $content, -1, PREG_SPLIT_NO_EMPTY); 
for($i=0,$n=count($resultatet); $i<$n; $i++) {
   ${"content_".$i} = "<b>".$resultatet[$i]."<br/>";
}

//dela upp text på olika sidor
if (isset($posts)) {
}
else {
$posts=0;
}

print ${"content_".$posts}."<br />\n";

$page = 0;
$tmp = $posts;
$summa=$i-$tmp;
$tmpy=$tmp-$page;
$tmpx=$tmp+$page;
if ($i>$page) {
if ($summa<=$page) {
echo "<a href=\"" . $PHP_SELF . "?posts=" . $tmpy . "&amp;io=".$io."\">Bakåt</a>";
}
elseif ($tmpx>$page) {
echo "<a href=\"" . $PHP_SELF . "?posts=" . $tmpy . "&amp;io=".$io."\">Bakåt</a><br /><a href=\"" . $PHP_SELF . "?posts=" . $tmpx . "&amp;io=".$io."\">Nästa</a>";
}elseif ($summa>$page) {
echo "<a href=\"" . $PHP_SELF . "?posts=" . $tmpx . "&amp;io=".$io."\">Nästa</a>";
}
}
     

print "<br /><br />\n";
print "<a href=\"nyheter.php\">« Tillbaka</a>\n";
print "</p>\n";
Medlem sedan juli 20011 222 inlägg
#6

bläddringen fixad nu iaf. efter att ha ändra page=0; till page=1; så ser den ut att fungera bra :)
provade också att med hjälp av replace() byta ut åäö mot deras htmlmotsvarigheter innan de kördes genom htmlenteties, vilket inte blev mycket bättre. Så jag måste nog köra utan htmlenteties ändå, men då blir det som sagt oavslutade taggar osv som ställer till fel.

Medlem sedan juli 20013 378 inlägg
#7

Hmm...
Svårt att se helheten...
Har du möjlighet att lägga ut ett exempel på hur innehållet i databasen kan se ut (med taggar och allt) för någon av de texter du har problem med ?

Medlem sedan juli 20011 222 inlägg
#8

här ser texterna ut när de ligger i databasen.
(ska kolla upp varför vissa <br> blir <br /> där. har då inte lagt in nån kod för att göra om till det innan texten sparas :) )

Medlem sedan juli 20013 378 inlägg
#9

Hmm...
Ser inga konstigheter i uppdelningskoden eller i det exempel du länkade till...

Du kanske får kolla lite på vad som ligger i innehållet på de sidor du har problem med...
Jag har rotat runt lite på din wap-sida och sett att du bl.a. inte alltid hanterar "&"-tecken korrekt, vilket ofelbart får en XML-tolk (och en WAP-nallefon) att sparka bakut...
exempel: (nyheter.php)

<a href="nyhet.php?io=2077">» Bland taxichaffisar & skatare</a><br/>

borde vara

<a href="nyhet.php?io=2077">» Bland taxichaffisar &amp;amp; skatare</a><br/>

Samma med din länk till "ratchet & clank" på samma sida...

Varje förekomst av "<", ">" eller "&" i ditt innehåll måste bytas ut mot "&amp;lt;", "&amp;gt;" respektive "&amp;"

Sedan såg jag du missat att lägga in citattecken i href-attributet i länk-taggarna på http://wap.spelbasen.nu/nyhet.php?io=2085 - och det är en direkt no-no i all XML (och alltså även i WML) vilket också får nallefoner och annat XML-kräset att kräkas

Kan du ta bort htmlentities ett tag så att man kan kolla på den underliggande koden på de sidor som pajjar för dig?

Kanske finns det fler ledtrådar där som tillsammans med koden kan hjälpa till att hitta den definitiva lösningen på dina problem ;)

Medlem sedan juli 20011 222 inlägg
#10

htmlenteties är borta nu. även rättat det där på nyhetsidorna. ska lägga in det på övriga sidor med sen :)

Medlem sedan juli 20013 378 inlägg
#11

Ok!
Återkom med länkar till de sidor du eventuellt fortfarande får problem med efter det så skall vi nog kunna klura ut en lösning åt dig till slut ;)

Medlem sedan juli 20011 222 inlägg
#12

fortfarande problem på recension.php (t.ex. http://wap.spelbasen.nu/recension.php?io=376 ) "mismatched tag". Den tycks ha kapat av <b> från texten. det ska ligga en <b> framför texten "All hands to battlestation" på t.ex. startrekrecensionen (den som det är adress till ovan). det innan där är sammanfattningen. Blir avslutande tag på en icke påbörjad tag :l

Medlem sedan juli 20013 378 inlägg
#13

Ok.
Kan du lägga upp den version av koden (recension.php) som ger felet tillsammans med textinnehållet i posten 376? (skicka dem med e-post om du tycker att det blir för stort här ;) )

Medlem sedan juli 20013 378 inlägg
#14

Hmm...
ett långskott kanske..
Men vad händer om du ändrar delningskoden till

//dela text

$resultatet = preg_split("(<b> )", $content, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE); 
for($i=0,$n=count($resultatet); $i<$n; $i++) {
   ${"content_".$i} = $resultatet[$i]."<br/>";
}

dvs in med

|PREG_SPLIT_DELIM_CAPTURE

och bort med

= "<b>". $resultatet
Medlem sedan juli 20011 222 inlägg
#15

La in det där PREG_SPLIT-grejen. och la även in "= "<b>". $resultatet " som jag inte hade på sidan längre. nu fungerar det felfritt i opera :D tack.
fast det fungerar inte i min mobil. för "korrupt data". vet inte varför :( borde fungera.

Medlem sedan juli 20013 378 inlägg
#16

Hmm...
Är du säker på att tecknet "»" har en teckenkod som är godkänd i Unicode? (Startsidan har ingen encoding="..." på <?xml?>-taggen... )

Medlem sedan juli 20011 222 inlägg
#17

Kan inte hitta det tecknet på unicode.org, men det har aldrig varit några problem med det tecknet. en kompis som testar sidan åt mig ibland kan det se det utan problem. han har wap1.1. Wap 1.0 kan tydligen inte tolka det men den skippar att visa det tecknet och levererar inga felmeddelanden. iaf inte på min mobil.

nu ligger encode på alla sidor :)

Tydligen så är det bara Startrek länken som fungerar i opera. (i min mobil fungerar ingen recension). på övriga recensioner blir det fel ( http://wap.spelbasen.nu/recension.php?io=372 ) "mismatched tag" den får fel på </p>. blir oavslutad <b>-tag. :l

Medlem sedan juli 20013 378 inlägg
#18

Hmmm....
Just nu tror jag inte att det är din PHP-kod det är fel på i alla fall....
Jag tycker det ser ut som om du råkat få in en del tecken- och taggnings-problem i din textdatabas...
Det är nämligen lite olika fel på de olika recensionerna ;)

Exempel:
Såhär ser det t.ex. ut på: http://wap.spelbasen.nu/artikel.php?io=375

<b>Command & Conquer: Tiberian Sun</b>

Du måste skriva alla "&" som "&amp;" överallt i ditt innehåll, även i texten i databasen!!! - annars kräks besökarnas nallefoner på "&"-tecknen i texterna...

Eftersom du tillåter HTML-taggar i innehållet i databasen, så måste du också vara extremt noga med hur du skriver in ditt innehåll ...
http://wap.spelbasen.nu/recension.php?io=373 t.ex. så avslutar du aldrig din <b>-tagg på raden

<b>Har du någon gång känt att du bara skulle vilja slå på allt som rör sig?

Detta förekommer också i t.ex. Sim City-recensionen...

Du har också åtminståne en slarvinskriven länk...
Länken från nyhetssidan till "Dragon Half" går till http://wap.spelbasen.nu/anime.php?io=378 - vilken inte finns...

http://wap.spelbasen.nu/smygtitt.php?io=370 har du med attributet align till en <img>-tagg - vilket inte finns i WML... vilket även det får nallefonerna att kräkas...
Förresten bör du nog inte skicka ut just den Ninja-bilden till WAP-nallefoner överhuvudtaget (den är visseriligen bara 12k stor... Men jpg-bilder funkar väl inte i alla nallar? )

Jag tycker det ser ut som om du slarvat lite med taggningen överlag när du matat in texterna ;)
Om du går igenom *hela* din innehållsdatabas med luskam så skall du se att du får till din WAP-sida också ;)

Hmm...
Du skulle nog slippa alla sådana här innehålls-taggnings-problem om du gick över till att inte tillåta några HTML-taggar överhuvudtaget i ditt innehåll (dvs till att använda htmlentities() i genereringen av både HTML- och WML-varianterna av dina sidor) - och istället använde någon form av BBCode - det som på wF kallas "Webforum-kod" istället.... På så sätt ser du ju till att bara lägga till de taggar du behöver istället för att du (som nu) plockar bort de som du inte vill ha... För det är ju mycket enklare att lägga till än att täcka upp och ta bort alla slarvfel man överhuvudtaget kan tänkas göra ;)

Medlem sedan juli 20011 222 inlägg
#19

hmm felet med oavslutade <b> taggar där kom jag på när jag kollade på texterna på www.spelbasen.nu. de har ingen rubrik i fetstil. och då blir det problem vid " "<b>". $resultatet " :l

anime.php har jag inte gjort än så det är därför som "dragon half" inte fungerar. än så länge är det bara recension.php som har bläddrascriptet

& ska jag filtrera iordning på alla sidor :)

Medlem sedan juli 20011 222 inlägg
#20

kom på en lösning till det där problemet med <b> taggarna. synd att jag inte får lösningen att fungera :p

gjorde en ifsats men den tar bara första alternativet och skippar att kolla upp med andra. har provat att växla plats på de två alternativen men utan framgång. även provat med == istället för =

$resultatet = preg_split("(<b>)", $content, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE); 
for($i=0,$n=count($resultatet); $i<$n; $i++) {

$part_len=strlen($resultatet[$i]);
$first_chars = substr($resultatet[$i],0,3);
if ($first_chars != "<b>") {
   ${"content_".$i} = "<b>".$resultatet[$i]."<br />";
}
elseif ($first_chars = "<b>") {
${"content_".$i}= $resultatet[$i]."<br />";
}

}
287 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
154 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)