Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: explode - koniec linii.
Forum PHP.pl > Forum > PHP
ukaszf9
Witam, piszę sobie niewielki skrypt (właściwie to dopiero zalążek tego co chce zrobić), i napotkałem problem.
Mianowicie w swoim skrypcie pozwalam na wysyłanie wiadomości przez użytkowników, które następnie lądują w pliku .txt z zapisaną wiadomością, datą.
Później chce je odpowiednio "odtworzyć/wczytać" na forum i do tego celu wykonuje pętle - niestety całość polega na tym, że dobrałem do tego chyba najmniej odpowiednią funkcję (no a raczej nie wiedziałem, że znak nowej linii jest ignorowany closedeyes.gif).
Przy próbie wyodrębnienie od siebie wiadomości, daty oraz napisu (dzięki któremu przeliczam ile zostało wysłanych wiadomości) całość się psuje gdyż explode ignoruje znak końca linii i daje ciągnie kolejne linie aż do napotkania kolejnego wzorca, który jest rozdzielany. Moje pytanie jest takie:
- Czy macie może jakiś inną radę jak to rozdzielić lub jak wykonać by explode zakończył swoje działanie w chwili napotkania końca linii i szukał po prostu kolejnego wzorca zaczynającego się od _datapost lub _trescpost.

Plik php wygląda tak:
  1. <?php
  2. // Odczytanie pliku
  3. $ready = file_get_contents("plik.txt");
  4.  
  5. // Podzielenie na wiersze, datę i treść wiadomości
  6. $ile_post = count(explode("_sesjapost", $ready));
  7. $data_post = explode("_datapost", $ready);
  8. $tresc_post = explode("_trescpost", $ready);
  9.  
  10.  
  11. /// Czy coś jest wpisane?
  12. if ($_POST['sesja_text'] != "") {
  13.  
  14. $message = $_POST['sesja_text'];
  15. $message = htmlspecialchars(str_replace("\n","<br />",$message));
  16.  
  17. /// Ustawienie czasu, treści wiadomości oraz numer wiadomości
  18. $sesja_text = "_sesjapost\n";
  19. $sesja_text .= "_ilepost ".$ile_post."\n";
  20. $sesja_text .= "_datapost ".date("d.m.y H:i:s")."\n";
  21. $sesja_text .= "_trescpost ".$message."\n\n";
  22.  
  23. // Otworzenie pliku,zapis i zamknięcie
  24. $save = fopen('plik.txt', 'a');
  25. fwrite($save, $sesja_text);
  26. fclose($save);
  27.  
  28. }
  29.  
  30. /// Dekodowanie wiadomości
  31. $tresc_post_decode = htmlspecialchars_decode($tresc_post[$i]);
  32. /// Użycię pętli w celu wyświetlenia wiadomości
  33. for ($i=1;$i<$ile_post;$i++) {
  34. echo "<div class=\"message\">";
  35. echo "<h2>Post numer $i";
  36. echo "<span style=\"float:right;\">$data_post[$i]</span>";
  37. echo "</h2>";
  38. echo "<div class=\"box\">$tresc_post_decode</div>";
  39. echo "</div>";
  40. }
  41. ?>


Przykładowe danego w pliku txt wyglądają tak:
  1. _sesjapost
  2. _ilepost 1
  3. _datapost 04.09.12 14:52:04
  4. _trescpost Moja wiadomosc
  5.  
  6. _sesjapost
  7. _ilepost 2
  8. _datapost 04.09.12 14:53:24
  9. _trescpost Moja wiadomosc<br>enter za spacje
  10.  
  11. _sesjapost
  12. _ilepost 3
  13. _datapost 04.09.12 14:53:25
  14. _trescpost ullallalalalla
  15.  
  16. _sesjapost
  17. _ilepost 4
  18. _datapost 04.09.12 14:53:33
  19. _trescpost To jest przykładowy tekst
  20.  
  21. _sesjapost
  22. _ilepost 5
  23. _datapost 04.09.12 14:53:51
  24. _trescpost &lt;script&gt;aaa&lt;/script&gt;
  25.  
  26. _sesjapost
  27. _ilepost 6
  28. _datapost 04.09.12 14:54:50
  29. _trescpost &lt;?php echo \&quot;nieudasie\&quot;;?&gt;
mrWodoo
yyy, explode( "\n", $jakaszmianna );
?

tylko pamiętam, że znak specjalny końca lini (\n) MUSI być w cudzysłowie (")

daj tylko \n\n zamiast \n, to będzie dzielić plik, na tablicę, a elementy będą oddzielone dwoma znakami nowej lini bo widzę, że tak masz, ew. jak zrobisz explode z \n tylko raz, to musisz sprawdzac czy coś jest w lini, jak tak to wyswietlasz, jak nie to uznajsze ze koniec elementu, i następna wartośc w zmiennej z pętli będzie dotyczyć kolejnego elementu
kalipek
  1. $ile_post = preg_match_all('/(?<=_datapost ).+/', $ready, $data_post);
  2. preg_match_all('/(?<=_trescpost).+/', $ready, $tresc_post);
  3.  
  4. for ($i=0;$i<$ile_post;$i++) {
  5. $tresc_post_decode = htmlspecialchars_decode($tresc_post[0][$i]);
  6. $nr = $i+1;
  7. echo "<div class=\"message\">";
  8. echo "<h2>Post numer ".$nr;
  9. echo "<span style=\"float:right;\">{$data_post[0][$i]}</span>";
  10. echo "</h2>";
  11. echo "<div class=\"box\">{$tresc_post_decode}</div>";
  12. echo "</div>";
  13. }
  14.  
ukaszf9
W kodzie kalipka pomieszała się zmienna data z liczbą wiadomości, ale to już sobie dorobiłem odpowiednią część korzystając z tego co mi podał. smile.gif
Ślicznie dziękuje obydwóm za pomoc.
kalipek
preg_match_all() zwraca liczbę wystąpień, tym samym informuje ile jest wiadomości, jednocześnie wrzucając w tablicę znaleziony ciąg - w jednej linijce masz załatwione obie zmienne.
ukaszf9
Hmm, faktycznie. Coś mi się pętla pomieszała bo nie chciała się wykonywać, dzięki jeszcze raz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.