Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> explode - koniec linii.
ukaszf9
post 4.09.2012, 15:23:12
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 3
Dołączył: 23.10.2011

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post
mrWodoo
post 4.09.2012, 16:33:41
Post #2





Grupa: Zarejestrowani
Postów: 160
Pomógł: 6
Dołączył: 13.01.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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

Ten post edytował mrWodoo 4.09.2012, 16:35:06


--------------------
Go to the top of the page
+Quote Post
kalipek
post 4.09.2012, 18:04:23
Post #3





Grupa: Zarejestrowani
Postów: 43
Pomógł: 13
Dołączył: 3.02.2011

Ostrzeżenie: (0%)
-----


  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.  


Ten post edytował kalipek 4.09.2012, 18:06:24
Go to the top of the page
+Quote Post
ukaszf9
post 4.09.2012, 18:54:13
Post #4





Grupa: Zarejestrowani
Postów: 33
Pomógł: 3
Dołączył: 23.10.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kalipek
post 4.09.2012, 18:59:09
Post #5





Grupa: Zarejestrowani
Postów: 43
Pomógł: 13
Dołączył: 3.02.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
ukaszf9
post 5.09.2012, 06:12:40
Post #6





Grupa: Zarejestrowani
Postów: 33
Pomógł: 3
Dołączył: 23.10.2011

Ostrzeżenie: (0%)
-----


Hmm, faktycznie. Coś mi się pętla pomieszała bo nie chciała się wykonywać, dzięki jeszcze raz.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 21:47