2016-04-28 1 views
3

solution nécessaire:Pourquoi ajoute-t-il le texte au début de la ligne suivante, et non la fin de la droite?

Je travaille avec un simple script PHP qui devrait:

  1. Ajouter "valeur4 :::" à la fin de la première ligne dans un fichier
  2. Ajouter " ::: "à la fin de toutes les lignes suivantes

Je suis novice en programmation, et je suis assise ici depuis deux jours essayant de comprendre cela. Peut-être un petit détail, ou il pourrait être totalement faux de faire cette tâche.

Cela peut être une mauvaise façon de le faire, ou peut-être un problème regex? Je ne sais vraiment pas.

Je vous demande de bien vouloir m'aider avec la solution.


Information:

Le fichier newstest.db ressemble à ceci:

ID:::value1:::value2:::value3::: 
1:::My:::first:::line::: 
2:::My:::second:::line::: 
3:::Your:::third:::line::: 

Et en utilisant ce script php je voudrais la faire ressembler à ceci:

ID:::value1:::value2:::value3:::value4::: 
1:::My:::first:::line:::::: 
2:::My:::second:::line:::::: 
3:::Your:::third:::line:::::: 

Problème:

Jusqu'à présent, j'ai presque eu, mais je suis confus pourquoi il ajoute la « valeur4 ::: » à la commençant de la deuxième ligne , puis ajoutez " ::: "au début (pas à la fin) de toutes les autres lignes.

donc je reçois un fichier qui ressemble à ceci:

ID:::value1:::value2:::value3::: 
value4:::1:::My:::first:::line::: 
:::2:::My:::second:::line::: 
:::3:::Your:::third:::line::: 

Je pensais que:

$lineshere = 'Some text here:::';  
$lines1 = $linehere.'value4:::'; 

génèrerait "texte ici ::: ::: valeur4"

Peut-être le problème est dû à cette façon d'ajouter ligne après ligne? Je suis une novice en programmation, donc j'ai peut-être utilisé des fonctions totalement fausses tec pour faire ce travail.

Mais dans ce cas, il semble que l'on ajoute un espace ou un saut de ligne/ligne au mauvais endroit.


Mon essai sur cette solution:

<?php 
// specify the file 
$file_source="newstest.db"; 

// get the content of the file 
$newscontent = file($file_source, true); 

//set a start value (clear memory) 
$lines =''; 

// get each line and treat it line by line. 

foreach ($newscontent as $line_num => $linehere) { 

    // add "value4:::" at the end of FIRST line only, and put it in memory $lines 
    if($line_num==0) { 
     $lines.= $linehere.'value4:::'; 

     // Just to see what the line looks like 
     //echo 'First line: '.$lines.'<br /><br />'; 
    } 

    // then add ":::" to the other lines and add them to memory $lines 
    if($line_num>0) { 
     $lines1 = $linehere.':::'; 
     $lines.= $lines1; 

     //just look at the line 
     //echo 'Line #'.$line_num.': '.$lines1.'<br /><br />'; 
    } 
} 

//Write new content to $file_source 
$f = fopen($file_source, 'w'); 
fwrite($f,$lines); 
fclose($f); 

echo "// to show the results ar array<br /><br />"; 

$newscontentlook = file($file_source, true); 
print_r(array_values($newscontentlook)); 
?> 
+1

Tout comme une note de côté: vous pouvez regarder vos fichiers à l'aide d'un éditeur hexadécimal pour voir les caractères de retour retour chariot/chariot ainsi. –

+0

Je crois, cela est dû au fait que $ linehere se termine par un saut de ligne. –

+0

Quel est le but de 'true' dans la ligne' $ newscontent = file ($ file_source, true); '? Changez-le en 'FILE_IGNORE_NEW_LINES' et cela devrait fonctionner. – ClasG

Répondre

2

Ceci est en fait très facile à réaliser avec file_get_contents et preg_replace, à savoir:

$content = file_get_contents("newstest.db"); 
$content = preg_replace('/(^ID:.*\S)/im', '$1value4:::', $content); 
$content = preg_replace('/(^\d+.*\S)/im', '$1:::', $content); 
file_put_contents("newstest.db", $content); 

Sortie:

ID:::value1:::value2:::value3:::value4::: 
1:::My:::first:::line:::::: 
2:::My:::second:::line:::::: 
3:::Your:::third:::line:::::: 

Ideone Demo

+0

C'était un approche intelligente. J'ai un problème cependant. Il ajoute maintenant "value4 :::" comme une nouvelle ligne en dessous de la première ligne, etc. La même chose pour chaque nouveau ":::". Une idée pourquoi? Est-ce lié à la façon dont j'obtiens le contenu du fichier? – Preben

+1

essayez d'ajouter '\ S' à la fin des deux expressions régulières, j'ai mis à jour la réponse. '\ S' Correspond à un seul caractère qui n'est PAS un" caractère d'espace "(séparateur Unicode, tabulation, saut de ligne, retour chariot, tabulation verticale, saut de page, ligne suivante)" \ S " –

+0

Je suis désolé. Je suis vraiment noob quand il s'agit de regex. Je n'ai pas compris où mettre '\ S'. J'ai essayé après le 'im' mais cela n'a pas fonctionné. Comment devrait-il regarder? – Preben

2

la fonction file() vous donne le fichier dans un tableau avec chaque ligne étant un élément du tableau. Chaque fin de la ligne (EOL) est incluse dans les éléments. Donc, l'ajout de texte à cette ligne sera après le EOL, et donc effectivement au début de la ligne suivante.

Vous pouvez choisir de ne pas utiliser file() et d'exploser le texte vous-même sur le EOL, de sorte que le EOL ne fait plus partie de l'élément de tableau. Ensuite, éditez les éléments et implosez le tableau à nouveau.

Ou fopen() le fichier, et fread() à travers vous-même. Cette dernière option est préférée car elle ne chargera pas le fichier entier en mémoire à la fois.

+0

Bonne explication. Pourrait être résolu avec l'approche actuelle, en ajoutant l'indicateur 'FILE_IGNORE_NEW_LINES' (si je ne me trompe pas totalement). – ClasG

1

Je pense que le problème est dans votre boucle à travers les lignes lues par fichier() fonction:

foreach ($newscontent as $line_num => $linehere) { 
    ... 

$linehere contient une nouvelle ligne à la fin, vous devriez simplement couper avant de l'utiliser:

foreach ($newscontent as $line_num => $linehere) { 
    $linehere = chop($linehere); 
    ... 

Si vous n'êtes pas chop le contenu en ligne, lorsque vous concaténer une chaîne, vous aurez:

LINE_CONTENTS\nSTRING_ADDED 

qui, lors de l'impression, sera:

LINE_CONTENTS 
STRING_ADDED 

Hope this helps ...

+0

Cela a résolu le problème de l'espace :-) Cependant, maintenant tout est enregistré dans une ligne quand écrit dans le fichier. Donc j'ai probablement besoin d'ajouter un code qui lui dit de sauvegarder chaque ligne avec une "fin de ligne"? Savez-vous comment? – Preben

+1

Oui: vous pouvez utiliser 'fputs()' au lieu de 'fwrite()' quand vous écrivez chaque ligne, ou ajouter un caractère '\ n' à la fin de chaque ligne avant' fwrite() '... – MarcoS