Avatar billede 4us.dk Nybegynder
23. august 2003 - 22:20 Der er 46 kommentarer og
3 løsninger

Kør gennem linjer og tjek længde

Jeg kunne godt tænke mig at sende en e-mail med funktionen:
mail()

Indholdet skal være i tekst.

Jeg kan godt sende mailen og det hele, men det svære er, at jeg godt vil have et slags "layout" i tekst, til emailen.

Layout eksempel:
|--------------|
|              |
|--------------|
|              |
|              |
|              |
|              |
|______________|


Problemet er jo at hvis jeg udskriver en variabel, $var
inde i den boks, går layout jo i stykker.

Så jeg søger en løsning, som kan regne ud selv, linje for linje evt. og udskrive det rigtige, så layout virker.

Så hvis man udskriver noget tekst derinde m.m. så vil det ikke ødelægge layout, men se ud som:

|--------------|
|    TEKST    |
|--------------|
|              |
| Navn: bob    |
| Kode: bebob  |
|              |
|______________|


Håber på det kan lade sig gøre; på forhånd mange tak!
Avatar billede 4us.dk Nybegynder
23. august 2003 - 22:21 #1
Ej, nu ødelagde eksperten jo ligefrem det jeg ville vise...

se det på http://www.4us.dk/eksempel.txt
Avatar billede squashguy Nybegynder
23. august 2003 - 22:26 #2
det kan du bruge str_pad() til:

echo str_pad("Navn: $navn", $bredde, " ");

den fylder automatisk n antal mellemrum på indtil bredden er nået
Avatar billede 4us.dk Nybegynder
23. august 2003 - 22:30 #3
Okay... den må jeg lige prøve, lyder lidt for nemt

og hvis jeg skal udskrive et tegn til sidst, når bredden er nået, så skal jeg skrive:
echo str_pad("Navn: $navn", $bredde, " "). "|";

:)

- tester lige
Avatar billede superanden Nybegynder
23. august 2003 - 22:31 #4
hvorfor laver du ikke bare mailen som Html.. så kan du bruge tables i mailen og så er du da sikker på at du ikke ødelægger dit design
Avatar billede schaefner Juniormester
23. august 2003 - 22:33 #5
<pre>
<?php
$overskrift = 'Hejsa';
$overskrift = str_pad($overskrift,14,' ', STR_PAD_BOTH);
?>

|--------------|
|<?php echo $overskrift; ?>|
|--------------|
|              |
|              |
|              |
|              |
|______________|
</pre>
Avatar billede jakoba Nybegynder
23. august 2003 - 22:36 #6
Sålænge du sender din mail i plaintekst (dvs ikke html formatteret) er det nogenlunde mnemt.

det er kun linierne:
|    TEKST    |
| Navn: bob    |
| Kode: bebob  |

der skal tænkes over. resten kan du lave som konstanter og blot indsætte som du vil.
start med en konstantlinie som denne:

$tomlinie = "|              |";
$llgt = strlen( $tomlinie );  // hele liniens længde (sørg for det er et lige tal).
$tekstderskalcentreres = "TEKST";
if ( strlen( $tekstderskalcentreres ) % 2 == 1 ) { // hvis længden er ulige
    $tekstderskalcentreres .= " ";    // tilføj blanktegn så længden bliver lige
}
$tlgt = strlen( $tekstderskalcentreres );  // længden på teksten
$centreretlinie = substr( $tomlinie, 0, ($llgt-$tlgt)/2 )
                .$tekstderskalcentreres
                .substr( $tomlinie, -($llgt-$tlgt)/2 );
// nu kan du udskrive $centreretlinie.
$tekstfravenstre = "Navn: bob";    // tekst der skal stå tilvenstre
$venstrelinie = substr( $tomlinie, 0, 3 ) .$tekstfravenstre;
$venstrelinie = $venstrelinie .substr( $tomlinie, strlen( $venstrelinie ) );

den anden venstrestillede linie laver du på samme måde.
Avatar billede tipsen Nybegynder
23. august 2003 - 22:36 #7
Om din boks bliver vist efter hensigten afhænger helt af hvilket skrifttype klientprogrammet (brugerens mail-program) anvender til at vise mailen - det vil kun blive vist "korrekt", hvis der anvendes en fast pitch skrifttype som eksempelvis courier, hvor alle bogstaver og tegn har samme bredde.

Du kan så, som superanden foreslår, benytte HTML til at styre layoutet, hvilket blot giver dig samme problem da du stadig er afhængig af hvorvidt klientprogrammet understøtter og er sat til at vise HTML kode samtidig med at du nu skal generere en mail der er komponeret som et gyldigt HTML dokument. (Og der her er det ikke nok at teste i Outlook Express).

Hvis du beslutter dig til at sende mailen som HTML, vil jeg anbefale, at du sender en mime-mail, hvor du vedlægger både en HTML samt en plain-text udgave af mailen, så modtagerne ikke er afhængige af at skulle læse HTML mails.
Avatar billede schaefner Juniormester
23. august 2003 - 22:42 #8
Avatar billede 4us.dk Nybegynder
23. august 2003 - 22:43 #9
Øh... okay...

har lige fået squashguy's til at virke ordenligt... så kommer jakoba med en syg lang kode for det... hehe..

men den skal da lige prøves... brb
Avatar billede 4us.dk Nybegynder
23. august 2003 - 22:45 #10
schaefner:
Vil du ikke lige forklare med ord hvad
str_pad($overskrift,14,' ', STR_PAD_BOTH);

betyder, altså de forskellige stringspladser?
Avatar billede schaefner Juniormester
23. august 2003 - 22:46 #11
den udfylder med ' ' på hver side af $variablen indtil den fylder 14 tegn, men prøv at se mit link :)
Avatar billede jakoba Nybegynder
23. august 2003 - 22:47 #12
3us.dk >> Nu jeg har set squashguys, wille jeg nok også selv bruge den :-)
Avatar billede squashguy Nybegynder
23. august 2003 - 22:49 #13
4us det kan meeeeget nemt betale sig, at downloade hele dokumentationen til php... eller læse den online. man kan faktisk ikke programmere php uden denne!
Avatar billede 4us.dk Nybegynder
23. august 2003 - 22:49 #14
Jeg kan ikke engang få jakoba's til at virke, den er nok lidt for vild :)
// er vidst parse error, men kan ikke se parse errors på min side, så kan ikke se hvad der er galt

tjekker lige schaefner's :)
Avatar billede jakoba Nybegynder
23. august 2003 - 22:55 #15
5us.dk >> det har jeg da også, men gider ikke altid lige kikke :-))
Avatar billede 4us.dk Nybegynder
23. august 2003 - 23:04 #16
Hehe... kan godt lide jeg hedder 3us.dk og 5us.dk når jeg hedder 4us.dk - er du gal jeg har mange domæner snart :-P

schaefner: hvis jeg nu i stedet for centrering, vil have at teksten skal være 5 mellemrum fra venstre tegn, hvordan vil det så skulle laves i følge dit eksempel?
Avatar billede schaefner Juniormester
23. august 2003 - 23:08 #17
så skal der lidt mere matematik til :)
Avatar billede 4us.dk Nybegynder
23. august 2003 - 23:12 #18
schaefner - hvor meget er det så? :-))
Avatar billede squashguy Nybegynder
23. august 2003 - 23:21 #19
4us, du mener

echo str_repeat(" ", 5)."noget mere";

?
Avatar billede schaefner Juniormester
23. august 2003 - 23:22 #20
jeg har forstået det sådan:

|.....5 mellemrum til venstre..................| (og så resten udfyldes med mellemrum)
Avatar billede 4us.dk Nybegynder
23. august 2003 - 23:27 #21
Ja, altså det skal forstås bare eksempel:

|    Tekst          |

Alså tegn starter, eksempel "|" og så går man 5 mellemrum til højre og skriver variabel der, og slutter igen samme bredde alle steder..

Den skal være som

http://schaefner.users.whitehat.dk/junk/391650.php

Den skal bare ikke være centreret, men venstrejusteret, med 5 mellemrum fra kanten.

Centreret ser ikke godt ud når man skal opstille tingene..
Avatar billede schaefner Juniormester
23. august 2003 - 23:28 #22
2 sek.
Avatar billede schaefner Juniormester
23. august 2003 - 23:29 #23
plus lidt mere :)
Avatar billede 4us.dk Nybegynder
23. august 2003 - 23:33 #24
okay, du køber 2 min ekstra for 2 points :-P
Avatar billede squashguy Nybegynder
23. august 2003 - 23:36 #25
vi venter... :p
Avatar billede schaefner Juniormester
23. august 2003 - 23:39 #26
Avatar billede squashguy Nybegynder
23. august 2003 - 23:40 #27
lige en note: det ser pændere ud med + i hjørnerne
Avatar billede squashguy Nybegynder
23. august 2003 - 23:42 #28
smukt :)
Avatar billede schaefner Juniormester
23. august 2003 - 23:42 #29
:)
Avatar billede tipsen Nybegynder
23. august 2003 - 23:45 #30
Det ser jo så lækkert ud, at jeg næsten er ked af at Arial er standard skrifttypen i mit mailprogram... :-)
Avatar billede schaefner Juniormester
23. august 2003 - 23:49 #31
ja, det er næsten til at tude over ;o)
Avatar billede tipsen Nybegynder
23. august 2003 - 23:59 #32
Har forøvrigt et halv-fadet alternativ her:

// GML = Generate Mail Text
function GML($text, $extra='none') {
    if ($extra=='none') {
        return sprintf("| %-58s |\r\n", $text);
    } elseif ($extra=='separator') {
        return sprintf("+-%-'-58s-+\r\n", $text);
    }
}
echo "<pre>";
echo GML('', 'separator');
echo GML('Kør gennem linjer og tjek længde');
echo GML('', 'separator');
echo GML('Kører det som det skal?');
echo GML('Ellers må du lige kommentere på:');
echo GML('Eksperten.dk :)');
echo GML('Efter squashguy\'s ønske er der');
echo GML('nu kommet + i hjørnerne :)');
echo GML('', 'separator');
echo '</pre>';
Avatar billede 4us.dk Nybegynder
24. august 2003 - 00:01 #33
hehe... simpelthen bare smukt! :)

Hvis nu jeg vil lægge alt ind i en variabel som hedder:
$udskriv
// så jeg kan skrive $udskriv i min mail() function.

Hvordan bliver det så gjort (har lige prøvet, blev lidt skævt)
Avatar billede schaefner Juniormester
24. august 2003 - 00:15 #34
Avatar billede tipsen Nybegynder
24. august 2003 - 00:18 #35
// GML = Generate Mail Text
function GML($text, $width = 60, $padding = 1) {
    $txt = '';
    foreach (explode("\r\n", $text) as $line) {
        if (!empty($line)) {
            $txt .= "|" . str_repeat(' ', $padding) . sprintf("%-".($width-$padding-2)."s", $line) . "|\r\n";
        } else {
            $txt .= '+' . str_repeat('-', $width-2) . "+\r\n";
        }
    }
    return $txt;
}
$text = "
Kør gennem linjer og tjek længde

Kører det som det skal?
Ellers må du lige kommentere på:
Eksperten.dk :)
Efter squashguy's ønske er der
nu kommet + i hjørnerne :)
";

Eksempel 1:
echo '<pre>';
echo GML($text, 70, 5);
echo '</pre>';

Eksempel 2:
$mailbody = GML($text, 74, 4);
mail($to, $subject, $mailbody);
Avatar billede tipsen Nybegynder
24. august 2003 - 00:27 #36
Sidste reviderede udgave:

// GMTT = Generate Mail Text in Table
function GMTT($text, $width=60, $padding = 1) {
    define('CRLF', "\r\n");
    $txt = '';
    foreach (explode(CRLF, $text) as $line) {
        if (!empty($line)) {
            $txt .= "|" . str_repeat(' ', $padding) . sprintf("%-".($width-$padding-2)."s", $line) . '|' . CRLF;
        } else {
            $txt .= '+' . str_repeat('-', $width-2) . '+' . CRLF;
        }
    }
    return $txt;
}
$text = "
GMTT = Generate Mail Text in Table - by tipsen

Dette er en alternativ funktion som kan fodres med en tekststreng
og derefter returnerer teksten indsat i en tabel.

Udseendet vil kun blive pænt, når det vises med en fastpitch font,
som eksempelvis Courier.

Udover selve teksten er der to inputargumenter til funktionen, nemlig
\$width:    Selve bredden af den ønskede tabel - skal selvfølgelig
            være bred nok til at indeholde selve teksten!
\$padding:  Hvor langt skal teksten rykkes ind i forhold til venstre
            margin?

Håber eksemplerne er til at forstå!
";

echo '<pre>';
echo GMTT($text, 74, 1);
echo '</pre>';
Avatar billede schaefner Juniormester
24. august 2003 - 00:28 #37
Jeg tror jeg vil se dyner nu. Godnat folkens :)
Avatar billede 4us.dk Nybegynder
24. august 2003 - 00:34 #38
schaefner: dit virker på din side, men når jeg tager det tl mig, så virker det ikke, hehe..

tjekker lige tipsen's  :)
Avatar billede 4us.dk Nybegynder
24. august 2003 - 00:38 #39
tipsen:

når jeg tager din kode, får jeg dette udskrift - kan det passe?
http://www.4us.dk/mail.jpg
Avatar billede tipsen Nybegynder
24. august 2003 - 00:38 #40
Der kan være issues mht. linieskift på tværs af platforme - i min udgave betyder det, at det kan være nødvendigt at ændre følgende linie i funktionen:

define('CRLF', "\r\n");

-så "\r\n" skal måske ændres til "\r", "\n" eller "\n\r" for at det fungerer - kunne forestille mig at schaefners lider af samme mangel.
Avatar billede tipsen Nybegynder
24. august 2003 - 00:40 #41
Det tyder på problemer med linieskift - prøv en af de andre typer som skrevet ovenfor - jeg får selv følgende output:

+------------------------------------------------------------------------+
| GMTT = Generate Mail Text in Table - by tipsen                        |
+------------------------------------------------------------------------+
| Dette er en alternativ funktion som kan fodres med en tekststreng      |
| og derefter returnerer teksten indsat i en tabel.                      |
+------------------------------------------------------------------------+
| Udseendet vil kun blive pænt, når det vises med en fastpitch font,    |
| som eksempelvis Courier.                                              |
+------------------------------------------------------------------------+
| Udover selve teksten er der to inputargumenter til funktionen, nemlig  |
| $width:    Selve bredden af den ønskede tabel - skal selvfølgelig      |
|            være bred nok til at indeholde selve teksten!              |
| $padding:  Hvor langt skal teksten rykkes ind i forhold til venstre    |
|            margin?                                                    |
+------------------------------------------------------------------------+
| Håber eksemplerne er til at forstå!                                    |
+------------------------------------------------------------------------+
Avatar billede tipsen Nybegynder
24. august 2003 - 00:48 #42
Hvad var resultatet?
Avatar billede 4us.dk Nybegynder
24. august 2003 - 01:16 #43
Kun \n :)

Men hvorfor hver gang man laver linieskift, kommer der en hel række med streg....
det skal der helst ikke komme (med mindre jeg vil have en streg lige præcis der :)
Avatar billede tipsen Nybegynder
24. august 2003 - 01:25 #44
Betyder "Kun \n :)" at det var \n der fik det til at fungere på dit OS?

Hvordan kunne du tænke dig at angive, at du kunne tænke dig "en streg lige præcis der"?
Avatar billede 4us.dk Nybegynder
24. august 2003 - 01:30 #45
\n betød at det virker på den måde - på Debian Linux, ja

Når man laver linieskift, kommer der en streg
|---------------------------------------|

Jeg vil gerne bare have
|                                      |


// sorry, er bare lidt træt :)
Avatar billede tipsen Nybegynder
24. august 2003 - 11:04 #46
// GMTT = Generate Mail Text in Table
function GMTT($text, $width=60, $padding = 1) {
    define('CRLF', "\n");
    $txt = '';
    foreach (explode(CRLF, $text) as $line) {
        if ($line == '-') {
            $txt .= '+' . str_repeat('-', $width-2) . '+' . CRLF;
        } else {
            $txt .= "|" . str_repeat(' ', $padding) . sprintf("%-".($width-$padding-2)."s", $line) . '|' . CRLF;
        }
    }
    return $txt;
}

$text = "-
GMTT = Generate Mail Text in Table - by tipsen
-
Dette er en alternativ funktion som kan fodres med en tekststreng
og derefter returnerer teksten indsat i en tabel.

Udseendet vil kun blive pænt, når det vises med en fastpitch font,
som eksempelvis Courier.
-
Udover selve teksten er der to inputargumenter til funktionen, nemlig
\$width:    Selve bredden af den ønskede tabel - skal selvfølgelig
            være bred nok til at indeholde selve teksten!
\$padding:  Hvor langt skal teksten rykkes ind i forhold til venstre
            margin?

Håber eksemplerne er til at forstå!
-";

echo '<pre>';
echo GMTT($text, 74, 1);
echo '</pre>';

Giver følgende output hos mig:

+------------------------------------------------------------------------+
| GMTT = Generate Mail Text in Table - by tipsen                        |
+------------------------------------------------------------------------+
| Dette er en alternativ funktion som kan fodres med en tekststreng      |
| og derefter returnerer teksten indsat i en tabel.                      |
|                                                                        |
| Udseendet vil kun blive pænt, når det vises med en fastpitch font,    |
| som eksempelvis Courier.                                              |
+------------------------------------------------------------------------+
| Udover selve teksten er der to inputargumenter til funktionen, nemlig  |
| $width:    Selve bredden af den ønskede tabel - skal selvfølgelig      |
|            være bred nok til at indeholde selve teksten!              |
| $padding:  Hvor langt skal teksten rykkes ind i forhold til venstre    |
|            margin?                                                    |
|                                                                        |
| Håber eksemplerne er til at forstå!                                    |
+------------------------------------------------------------------------+

Dvs. hvis du ønsker en tværgående streg, laver du blot en enkelt - på den linie.
Avatar billede 4us.dk Nybegynder
24. august 2003 - 13:18 #47
Jeg fandt også ud af igår, at jeg bare kunne lave et mellemrum, så lavede den de sidste mellemrum for mig :)
Giv lige et svar
Avatar billede tipsen Nybegynder
24. august 2003 - 13:24 #48
Du må så selv om hvilken udgave du vil bruge - nu kan du sikkert også finde ud af at tilrette den, hvis behovet skulle melde sig - her er et svar hvertfald.
Avatar billede 4us.dk Nybegynder
24. august 2003 - 15:07 #49
Jeps, tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester