/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Hvordan vises .txt - filer i browseren med~
Fra : Jakob Munck


Dato : 06-12-05 11:35

Jeg vil gerne hav3e, at mine brugere kan læse nogle tekstfiler, som er lavet
i Notepad og lagret i .txt-format på serveren. I dette format er der
linieombrydning, så når man åbner en fil i Notepad.

Men problemer er så, når denne tekstfil er uploadet til serveren og jeg
gerne vil kunne læse den ved at klikke på et link. Så forsvinder disse
liniebrud, og teksten bliver nærmest ulæselig, da linierne er meget bredere
end browservinduet. Det duer ikke.

Jeg ved at man kan lagre teksten i en database og lave den om til html, så
virker det. Men jeg vil gerne bevare teksterne i deres oprindelige
..txt-format og læse dem direkte fra dette. Men de skal dog vises liniebrud,
når de vises i browseren, da de ellers er ulæselige.

Her kan du se problemet, ved at klikke på linket: "En lang tekst"

www.visito.org

Hvad er løsningen?
Hvordan kan jeg læse en sådan txt-fil, så den viser de rigtige liniebrud?

v.h.
Jakob



 
 
Jesper H (06-12-2005)
Kommentar
Fra : Jesper H


Dato : 06-12-05 12:05

Hej Jakob

Tjah, det er lidt selvmodsigende; Du vil gerne have linie-ombrydning,
men vil gerne bevare teksten i det oprindelige .txt-format.
At du kan få vist noget med tekst-ombrydning i Notepad er en speciel
funktionalitet i det program, som man kan slå til eller fra. Så
ligeledes kan der måske være en sådan i din browser, men det er nok
heller ikke det, du søger, da brugeren så selv skal slå det til i
sin browser.

Du foreslår selv at konvertere det til html og lægge det i en
database, men det behøver du nu ikke - i PHP kan man godt åbne en
fil og gøre et-eller-andet ved den:
Hvis jeg var dig, ville jeg nok lave en php-side, som til dels kunne
vise indholdet af en .txt-fil sådan som du gerne vil have det, samt
til dels henviste direkte til den oprindelige fil til download.
Det sidste skulle ikke være så svært (et almindeligt link).
Det første kan laves ved, at du laver php-siden med en div-boks hvor
word-wrap er slået til (en css-kommando, vistnok), og inde i den har
et par <pre>-tags (som laver linieskift og ikke fjerner white-space),
hvori tekst-filens indhold så står (vha. php-kommandoen fopen, tror
jeg nok).

--
Mvh Jesper, http://fdf.dk/landsdel1/


Troels Hansen (06-12-2005)
Kommentar
Fra : Troels Hansen


Dato : 06-12-05 12:40

Jakob Munck wrote:

> Hvad er løsningen?
> Hvordan kan jeg læse en sådan txt-fil, så den viser de rigtige liniebrud?

Når du viser en txt fil i et html dokument tager den ikke linieskift med
fra notepad. De skal erstattes af <br> for at du bevarer formateringen.

$pointer = fopen("/sti/til/filen.txt", r);
if ($pointer) {
while (!feof($pointer)) {
$text .= fgets($pointer, 1000);
}
fclose($pointer);
ereg_replace("\r","",$text);
ereg_replace("\n","<br />",$text);
}
echo $text;

Denne burde virke....

Jakob Munck (06-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 06-12-05 15:48

>
> Når du viser en txt fil i et html dokument tager den ikke linieskift med
> fra notepad. De skal erstattes af <br> for at du bevarer formateringen.
>
> $pointer = fopen("/sti/til/filen.txt", r);
> if ($pointer) {
> while (!feof($pointer)) {
> $text .= fgets($pointer, 1000);
> }
> fclose($pointer);
> ereg_replace("\r","",$text);
> ereg_replace("\n","<br />",$text);
> }
> echo $text;
>

Den kode fjerner alle linieskift i teksten og gør den derfor ulæselig. Og...

echo <pre>;
echo $text;
echo "</pre>";

duer heller ikke da det bringer teksten tilbage til sin oprindelige
tilstand, dvs. uden de nødvendige liniebrud. Men jeg eksperimenterer videre.

v.h.
Jakob



Troels Hansen (06-12-2005)
Kommentar
Fra : Troels Hansen


Dato : 06-12-05 16:45

Jakob Munck wrote:
>> ereg_replace("\r","",$text);
>> ereg_replace("\n","<br />",$text);
>
> Den kode fjerner alle linieskift i teksten og gør den derfor ulæselig. Og...
>

Ja, det så jeg også.
Den skulle naturligvis se således ud:

$text = ereg_replace("\r","",$text);
$text = ereg_replace("\n","<br />",$text);

Den virker.
men der er mange måder at gøre det på, og du kan også brugt nl2br i
stedet, og evt en wordwrap til at wrappe linierne.

Jakob Munck (06-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 06-12-05 17:06

>
> $text = ereg_replace("\r","",$text);
> $text = ereg_replace("\n","<br />",$text);
>

Det kan jeg ikke få til at virke, men til gengæld har jeg arbejdet lidt med
de tidligere forslag, kombineret dem og fået det hele til at virke som det
skal, nemlig således at txt-filerne i en mappe automatisk vises på en liste
og man ved et klik på en af disse filer i listen, bringes til en visning af
teksten med liniebrud etc.

Det sker med denne kode:

-----------------------------------------------------------------

<html><head></head><body>

<style type="text/css">
<!--
div.boks {
height: 200px;
width: 800px;
/*width: 100%;*/

border: 0px solid black;
background: orange;
word-wrap: break-word;
}
-->
</style>


<div class="boks">
<?
$k = $_GET["i"];

$pointer = fopen("$k", r);
if ($pointer) {
while (!feof($pointer)) {
$text .= fgets($pointer, 1000);
}
fclose($pointer);
ereg_replace("\r","",$text);
ereg_replace("\n","<br />",$text);
}
echo "<pre>";
echo $text;
echo "</pre>";
?>
</div>

<?
foreach (glob("tekster/*.*") as $filename)
{
echo "<a href='test.php?i=$filename'>".$filename."</a><br/>";
}
?>

</body></html>

-----------------------------------------

v.h.
Jakob



Troels Hansen (06-12-2005)
Kommentar
Fra : Troels Hansen


Dato : 06-12-05 17:28

Jakob Munck wrote:
>>$text = ereg_replace("\r","",$text);
>>$text = ereg_replace("\n","<br />",$text);
>>
>
>
> Det kan jeg ikke få til at virke, men til gengæld har jeg arbejdet lidt med
> de tidligere forslag, kombineret dem og fået det hele til at virke som det
> skal, nemlig således at txt-filerne i en mappe automatisk vises på en liste
> og man ved et klik på en af disse filer i listen, bringes til en visning af
> teksten med liniebrud etc.

Det jeg mente var at du skulle tage de to linier jeg sendte tiul sidst,
og sætte dem ind i stedt for de to ereg_replace linier der var, således
at det kommer til at se således ud:
<?php
$k = $_GET["i"];
$pointer = fopen("$k", r);
if ($pointer) {
while (!feof($pointer)) {
$text .= fgets($pointer, 1000);
}
fclose($pointer);
$text = reg_replace("\r","",$text);
$text = reg_replace("\n","<br />",$text);
}
echo $text;
?>

Tip: Undgå at bruge php shorttag (<? ?>) og gør dig det til en vane
altid at skrive <?php ?> da du næsten sikkert vil opleve en gang hvor du
skal lægge noget op på en webserver, hvor den ikke accepterer shorttags,
og du så skal sidde og lave en search and replace på det hele.

Jakob Munck (06-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 06-12-05 18:00

> Det jeg mente var at du skulle tage de to linier jeg sendte tiul sidst, og
> sætte dem ind i stedt for de to ereg_replace linier der var, således at
> det kommer til at se således ud:
> <?php
> $k = $_GET["i"];
> $pointer = fopen("$k", r);
> if ($pointer) {
> while (!feof($pointer)) {
> $text .= fgets($pointer, 1000);
> }
> fclose($pointer);
> $text = reg_replace("\r","",$text);
> $text = reg_replace("\n","<br />",$text);
> }
> echo $text;
> ?>

Sådan har jeg også testet den, og den giver følgende fejlmelding:

"Fatal error: Call to undefined function: reg_replace() "


>
> Tip: Undgå at bruge php shorttag (<? ?>) og gør dig det til en vane altid
> at skrive <?php ?> da du næsten sikkert vil opleve en gang hvor du skal
> lægge noget op på en webserver, hvor den ikke accepterer shorttags, og du
> så skal sidde og lave en search and replace på det hele.

OK, det noterer jeg mig. Men hvor mange servere er egentlig sat sådan op, at
de kun virker hvis der skrives "<?php..." ? Er det ikke meget usædvanligt?

Og så selvfølgelig til alle: Tusind tak for hjælpen.

v.h.
Jakob

Det er bare så besværligt hele tiden at skulle skrive p



Jakob Munck (06-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 06-12-05 18:13

Så faldt tiøren! Der var bare røget et par e'er ud af din sidste version af
koden. De er på plads nu, og så virker det:

$text = ereg_replace("\r","",$text);
$text = ereg_replace("\n","<br />",$text);

Tak for hjælpen, det er solid kode, som jeg vil studere nærmere for at blive
klogere.

v.h.
Jakob



Peter Brodersen (06-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 06-12-05 20:02

On Tue, 06 Dec 2005 12:40:29 +0100, Troels Hansen <idle@invalid.email>
wrote:

>$pointer = fopen("/sti/til/filen.txt", r);
>if ($pointer) {
> while (!feof($pointer)) {
> $text .= fgets($pointer, 1000);
> }
> fclose($pointer);
> ereg_replace("\r","",$text);
> ereg_replace("\n","<br />",$text);
>}
>echo $text;

Eller i kort udgave med præcis det samme resultat:
echo nl2br(file_get_contents("/sti/til/filen.txt"));

Der er ingen grund til at bruge fopen(), når man alligevel skal læse
hele indholdet.

Tilsvarende er der ingen grund til at bruge ereg_replace(), når der
ikke benyttes regulære udtryk - str_replace() fungerer helt lige så
fint (og skal der benyttes regulære udtryk, er preg_replace() nok at
foretrække - den er typisk hurtigere, og i PHP6 bliver ereg flyttet ud
som en extension, så man ikke kan regne med at de altid findes:
http://www.php.net/~derick/meeting-notes.html#move-ereg-to-pecl )

Bare af nysgerrighed - er det meget gammel kode, du har liggende? I
meget gamle dage brugte man ereg_replace() for at erstatte simple
tegn. "Først" i PHP3.0.6 dukkede str_replace() op. Tilsvarende,
fopen() har også eksisteret i lang tid. Folk gik dog over til at bruge
implode('',file("filnavn.txt"))-konstruktionen efter lidt tid, og i
PHP4.3 kom file_get_contents() så langt om længe.

--
- Peter Brodersen

Jakob Munck (06-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 06-12-05 20:31

>>$pointer = fopen("/sti/til/filen.txt", r);
>>if ($pointer) {
>> while (!feof($pointer)) {
>> $text .= fgets($pointer, 1000);
>> }
>> fclose($pointer);
>> ereg_replace("\r","",$text);
>> ereg_replace("\n","<br />",$text);
>>}
>>echo $text;
>
> Eller i kort udgave med præcis det samme resultat:
> echo nl2br(file_get_contents("/sti/til/filen.txt"));
>

Det er helt korrekt, jeg har testet det. Så den korteste og nyeste kode må
naturligvis foretrækker.

Mange tak for hjælpen.

v.h.
Jakob



Jesper H (06-12-2005)
Kommentar
Fra : Jesper H


Dato : 06-12-05 13:30

Kommer du så ikke til at mangle nogle på-hinanden-følgende
mellemrum? Derfor jeg foreslog at bruge <pre>-tags...

--
Mvh Jesper, http://fdf.dk/landsdel1/


Frederik Sunne (06-12-2005)
Kommentar
Fra : Frederik Sunne


Dato : 06-12-05 13:45
Jesper H (06-12-2005)
Kommentar
Fra : Jesper H


Dato : 06-12-05 19:29

Hej Jakob

Var det nødvendigt at bruge linierne:
<?PHP
$text = ereg_replace("\r","",$text);
$text = ereg_replace("\n","<br />",$text);
?>

når du senere skrev:
<?PHP
echo "<pre>";
echo $text;
echo "</pre>";
?>

? For jeg troede nemlig at <pre> også tog højde for netop linieskift,
hvormed erstatning af \n til <br /> burde være unødvendig...

--
Mvh Jesper, http://fdf.dk/landsdel1/


Jakob Munck (06-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 06-12-05 19:42


"Jesper H" <jesper.haukrogh@gmail.com> skrev i en meddelelse
news:1133893716.115660.7780@f14g2000cwb.googlegroups.com...
Hej Jakob

Var det nødvendigt at bruge linierne:
<?PHP
$text = ereg_replace("\r","",$text);
$text = ereg_replace("\n","<br />",$text);
?>

når du senere skrev:
<?PHP
echo "<pre>";
echo $text;
echo "</pre>";
?>

? For jeg troede nemlig at <pre> også tog højde for netop linieskift,
hvormed erstatning af \n til <br /> burde være unødvendig...


Nej, du har ret, det var faktisk ikke nødvendigt at bruge den sidste udgave
af koden, hvor \n udskiftes, da "pre" gør det samme. Men når jeg alligevel
foretrækker den sidste udgave af koden er det fordi at når man anvender
<pre> giver det en masse problemer i html'en, som jeg ikke lige har tid til
at finde ud af, hvordan man løser.

v.h.
Jakob



Erik Ginnerskov (07-12-2005)
Kommentar
Fra : Erik Ginnerskov


Dato : 07-12-05 00:13

Jakob Munck wrote:
> Jeg vil gerne hav3e, at mine brugere kan læse nogle tekstfiler, som
> er lavet i Notepad og lagret i .txt-format på serveren. I dette
> format er der linieombrydning, så når man åbner en fil i Notepad.
>
> Men problemer er så, når denne tekstfil er uploadet til serveren og
> jeg gerne vil kunne læse den ved at klikke på et link. Så forsvinder
> disse liniebrud, og teksten bliver nærmest ulæselig, da linierne er
> meget bredere end browservinduet. Det duer ikke.

Problemet opstår, fordi du indlæser din tekstfil 'nøgen' i browseren. Lægger
du den ind i en html-side og bruger tagget <pre>, vil det fungere.

Du behøver såmænd ikke så meget kompliceret php-kode, som der er blevet lagt
op til i den hidtidige del af tråden. Dette skulle gøre det:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Titel</title>
</head>
<body>
<pre>
<? include('en_lang_tekst.txt'); ?>
</pre>
</body>
</html>

Gem denne kode som langtekst.php - og så bør du ikke have ordmellemrum i
filnavne. Erstat dem med underscore eller bindestreg.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Peter Brodersen (07-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 07-12-05 00:20

On Wed, 7 Dec 2005 00:13:28 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

>Gem denne kode som langtekst.php - og så bør du ikke have ordmellemrum i
>filnavne. Erstat dem med underscore eller bindestreg.

Bare for en god ordens skyld:
readfile() kan bruges i stedet for include(), hvis man blot skal have
kastet filen råt tilbage, uden at php bekymrer sig om indholdet.

Derudover skal tags nok også tilpasses, idet en tekstfil, der
omhandler fx HTML, pludselig kan resultere i spøjst output (også selv
om teksten er inde i en <pre>...</pre>).

Mit forslag til den relevante del:

<pre>
<?php
print htmlspecialchars(file_get_contents('en_lang_tekst.txt'));
?>
</pre>


pre kan nogle gange være at foretrække frem for almindelig tekst og
nl2br(), hvis fx flere mellemrum i træk rent faktisk skal vises
visuelt.
--
- Peter Brodersen

Jakob Munck (07-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 07-12-05 07:37

>
> Mit forslag til den relevante del:
>
> <pre>
> <?php
> print htmlspecialchars(file_get_contents('en_lang_tekst.txt'));
> ?>
> </pre>
>

Det virker ikke (hos mig). Se her:

<?
//virker ikke, siger "failes to open stream..."
$k = $_GET["i"];
print htmlspecialchars(file_get_contents('$k'));


//virker godt:
$k = $_GET["i"];
echo nl2br(file_get_contents("$k"));
?>

v.h.
Jakob






Peter Brodersen (08-12-2005)
Kommentar
Fra : Peter Brodersen


Dato : 08-12-05 23:10

On Wed, 7 Dec 2005 07:37:15 +0100, "Jakob Munck"
<jm2_fjern_dette@webspeed.dk> wrote:

>print htmlspecialchars(file_get_contents('$k'));

Du bruger enkelt-gåseøjne her.

'$k' virker ikke
"$k" virker
$k virker

Fx:
print htmlspecialchars(file_get_contents($k));

Men det er dog usundt at inkludere en fil, hvor filnavnet udelukkende
er baseret ud fra en brugervariabel. Brugeren kan angive en hvilken
som helst fil.
--
- Peter Brodersen

Jakob Munck (07-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 07-12-05 07:16

> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
> "http://www.w3.org/TR/html4/strict.dtd">
> <html>
> <head>
> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
> <title>Titel</title>
> </head>
> <body>
> <pre>
> <? include('en_lang_tekst.txt'); ?>
> </pre>
> </body>
> </html>
>

Det duer ikke, i hvert fald ikke hos mig. Se her:

<?php
//teksten hentes ind
$k = $_GET["i"];

//Virker fint:
echo nl2br(file_get_contents("$k"));

//duer ikke, linieb mangler:
include("$k");

//duer ikke, linierne brækker ikke:
echo "<pre>";
include("$k");
echo "</pre>";
?>


> Gem denne kode som langtekst.php - og så bør du ikke have ordmellemrum i
> filnavne. Erstat dem med underscore eller bindestreg.
>

Det er netop pointen af teksterne skal kunne have filnavne med mellemrum i,
da de lægges op af brugere, som ikke forventes at kunne finde ud af at lave
_ mellem hver navn.

v.h.
Jakob



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste