[PHP] .txt en opslaan

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ad Hox
  • Registratie: Maart 2003
  • Laatst online: 19:58
Ik heb een script waarmee ik gegevens in een .txt opsla. Het gaat om een aantal gegevens zoals titel, link kleur, tekst kleur etc.

Ook zit er een veld 'Pagina' in: dit gewoon een lap tekst. Hier heb ik ook een textarea in HTML voor gemaakt. Ik heb alle velden toegevoegd met urldecode.

Nu is mijn probleem: Als ik een ENTER doe in de textarea, dan krijg ik problemen in mijn .txt file omdat ik die als volgt opstel:

Titel;Linkkleur;..[ETC]....;Pagina

Als er dus ENTERS komen in Pagina gaat het helemaal mis. Ik heb al nl2br gebrobeerd maar dat lukt niet.

De code om alles in een .txt op te slaan:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
if ($_POST['submit'])
{ 
unlink ("data.dat");
$fnew = fopen ("data.dat", "w+");
$file = "data.dat"; 
$pagina=nl2br($pagina); 
$xtra_inhoud = "$titel;$bgplaatje;$achtergrondkleur;$tekstkleur;$linkkleur;$lettertype;$pagina"; 
$open = fopen($file,"w+"); 
$schrijven = fwrite($open,$xtra_inhoud); 
$sluiten = fclose($open);
echo "<font style=style7><li>De instellingen zijn succesvol veranderd.";
}


De code om alles uit te lezen:
PHP:
1
2
3
4
5
6
7
$bestand = "data.dat"; 
$bestand_file = file($bestand);  
foreach($bestand_file as $regel){
$pagina2=nl2br($pagina2);  
list($titel2, $bgplaatje2, $achtergrondkleur2, $tekstkleur2, $linkkleur2, $lettertype2, $pagina2)= split (";", $regel);
echo "<font style=style7><li>De instellingen zijn succesvol geladen.";
}


En dan de code van de textarea 'Pagina':
code:
1
<textarea name="pagina" cols="50" rows="8" class="style7"><? echo urldecode($pagina2); ?></textarea>


De andere velden doen het wel goed met spaties enzo, maar dat kan ook gewoon met urldecode. De ENTERS willen alleen niet lukken omdat hij dus een nieuwe regel in het .txt bestand aanmaakt, en dat geeft problemen.

Hoe kan ik dit het beste oplossen?

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Je kunt je enters encoden en decoden. Gewoon een zeer onwaarschijnlijk tekenreeksje bedenken en een str_replace("\n", $tekenreeksje, $input) doen.
Optie twee is om enters toe te staan, dit maakt het inlezen iets lastiger, maar ook te doen. In plaats van regel voor regel lees je in totdat je al je benodige elementen hebt.

Denk je er trouwens ook aan dat mensen in je tekstvak ook een ";" kunnen typen ;)

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Ad Hox
  • Registratie: Maart 2003
  • Laatst online: 19:58
Thanks, str_replace was dé methode om dit op te lossen.

Andere tekens buiten ";" gaan een beetje lastig, de | (links van je ENTER) pakt hij bijvoorbeeld niet (dan zegt ie dat de SPLIT EMPTY is)...

Acties:
  • 0 Henk 'm!

Verwijderd

ipv een ';', wat toch wel een veel voorkomend teken is, zou je toch ook iets anders kunnen nemen?
'@@!!@@' bijvoorbeeld? Dan weet je bijna zeker dat het nooit voorkomt.
Want een ';' is een heel normaal leesteken bij een langere opsomming.
Maar dat is niet de oorzaak van je probleem, welke al opgelost is, maar het zou volgens mij wel verstandig zijn om hier rekening mee te houden.

Acties:
  • 0 Henk 'm!

  • Ad Hox
  • Registratie: Maart 2003
  • Laatst online: 19:58
Daar heb je gelijk in, maar als ik een ander teken als een ";" doe dan gaat het helemaal fout. Hij lijkt gewoon niet meerdere tekens te pakken in mijn script.

Acties:
  • 0 Henk 'm!

Verwijderd

Ad Hox schreef op dinsdag 06 december 2005 @ 10:34:
Daar heb je gelijk in, maar als ik een ander teken als een ";" doe dan gaat het helemaal fout. Hij lijkt gewoon niet meerdere tekens te pakken in mijn script.
Ooit gehoord van escapen? Zodat je de pipe even een escape mee geeft, zodat deze zijn functie binnen REGEX niet volbrengt maar gewoon als tekst opgenomen word.

[ Voor 2% gewijzigd door Verwijderd op 06-12-2005 11:16 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Escapen is sowieso de netste manier om dit op te lossen. Elke replace naar een "onwaarschijnlijke tekenreeks" geeft het risico dat iemand deze reeks in een keer invoert. En als we Murphy moeten geloven dan gebeurt het dus ook een keer.

Een een implementatie die gebruik maakt van escapen kan er zo uit zien:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
 * escapes all characters in mixed input that are present in
 * str strChars. The escapecharacter str escapeChar is set to \ 
 * by default but may be set to any single character. When
 * multiple characters are specified as escape charcter, only the
 * first is used.
 * If input is an array, all values of the array will be escaped recursively
 */
function escape($input, $strChars, $escapeChar='\\') {
    $escaped = array();

    //only use first char of scape char string
    $escapeChar = $escapeChar[0];

    //operate arrays recursively
    if (is_array($input)) {
        foreach ($input as $key=>$value) {
            $input[$key] = escape($value, $strChars, $escapeChar);
        }
        return $input;
    }

    //Always escape escape char first
    $input = str_replace($escapeChar, $escapeChar .$escapeChar, $input);
    array_push($escaped, $escapeChar);

    //escape specified chars
    $numChars = strlen($strChars);
    for ($i=0; $i<$numChars; $i++) {

        $char = $strChars[$i];

        //never escape twice
        if (!in_array($char, $escaped)) { 
            $input = str_replace($char, $escapeChar .$char, $input);
            array_push($escaped, $char);
        }
    }

    return $input;
}


/**
 * splits str string in pieces that are delimited by unescaped
 * occurences of str char.
 */
function escapedSplit($string, $char, $escapeChar='\\') {

    $escapeChar = $escapeChar[0];
    $output = array();

    $offsetStart = 0;
    $partStart = 0;

    //find splitcharacters in string
    while(($pos = strpos($string, $char, $offsetStart)) !== FALSE) {
        $unescaped = TRUE;

        //determine escaped status
        for ($i=$pos-1; $string[$i] == $escapeChar; $i--) {
            $unescaped = !$unescaped;
        }

        //split if unescaped
        if ($unescaped) {
            $partLength = $pos - $partStart;
            array_push($output, substr($string, $partStart, $partLength));
            $partStart = $pos+1;
        }
        $offsetStart = $pos+1;
    }
    
    //last part
    array_push($output,substr($string, $partStart));

    //unescape entries
    $output = str_replace($escapeChar .$char, $char, $output);
    $output = str_replace($escapeChar .$escapeChar, $escapeChar, $output);

    return $output;
}


Het volgende voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/** example **/
$input = array (
    'foo', 
    'semi;colon',
    'escaped \\; semicolon',
    '3 escape chars \\\\\\'
    );

$textline = implode(';', escape($input, ';'));

$splitted = escapedSplit($textline, ';');

echo '<pre>';
print_r($input);
echo '</pre><hr><pre>' .$textline .'</pre><hr><pre>';
print_r($splitted);
echo '</pre>';

Levert dan:
Array
(
    [0] => foo
    [1] => semi;colon
    [2] => escaped \; semicolon
    [3] => 3 escape chars \\\
)

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

foo;semi\;colon;escaped \\\; semicolon;3 escape chars \\\\\\

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

Array
(
    [0] => foo
    [1] => semi;colon
    [2] => escaped \; semicolon
    [3] => 3 escape chars \\\
)


Dezelfde truuk kun je toepassen om regels waar enters in voor kunnen komen toch met enters te scheiden. Nadeel daarvan is wel dat je de mogelijkheid om regel voor regel te verwerken opgeeft. Je moet dus de tekst in zijn geheel in je geheugen laden.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Dark Wanderer
  • Registratie: September 2003
  • Laatst online: 11-08-2024

Dark Wanderer

Or not :P

SORRY VERWIJDER DEZE AUB FF

[ Voor 96% gewijzigd door Dark Wanderer op 09-12-2005 10:54 ]

hand·te·ke·ning (de ~ (v.))

Pagina: 1