Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podział tekstu zawierajacy powtarzające się znaki
Forum PHP.pl > Forum > PHP
mxm
Witam!!!

Szukałem coś na forum, ale ie znalazłem jednoznaczej podowiedzi. Tak więc krótko.
Mam tekst w zmiennej:
  1. <?php
  2. $tekst = "101. dsfsdfsdaf
  3. fgdfgsd
  4. gsdfgd
  5. gdsg
  6. dfsggsdf
  7.  
  8. 102. dsfdsafgdfsg
  9. sdgdfgsdgd
  10. dsfgdfs
  11. gsdfg
  12.  
  13. 103. fdssfds
  14. fsdfsdfsdsf";
  15. ?>
Teraz chciałbym aby tekst wg liczb, które się powtarzają, podzielić ten tekst i zapisać do tablicy (każdy numer + tekst znajduący się pod nim w osbnym wierszu tabeli).

Używam funkcji preg_match_all i wyrażenia regularne, ale nie za bardzo mi wychodzi. Funkcja znakomicie sprawuje się kiedy szukane wyrażenie jest w jednej linii. Wtedy przeszukuje wszystkie linie w poszukiwaniu podane wyrażenia regularnego i zapisuje w tablicy.

Kłopot w tym, iż ja chciałbym podzielić tekst z nowymi liniami. Kiedy używam flagi "s" jest to możliwe, ale...
  1. <?php
  2. preg_match_all ("/(d{3}.*)/s",$tresc , $wynik);
  3. ?>
źle radzi sobie z przeszukiwaniem i podziałem...

Ma ktoś pomysł jak sobie z tym poradzić?? sad.gif

Potrzebne mi jest to o tyle, że potem w tych tekstach chcę przeszukiwać już konkretne dane, które mogą się powtarzać ale nie muszą...
Mlodycompany
daj sobie
  1. <?php
  2. $tekst = "101. dsfsdfsdaf
  3. fgdfgsd
  4. gsdfgd
  5. gdsg
  6. dfsggsdf
  7. |
  8. 102. dsfdsafgdfsg
  9. sdgdfgsdgd
  10. dsfgdfs
  11. gsdfg
  12. |
  13. 103. fdssfds
  14. fsdfsdfsdsf";
  15.  
  16. $tekst = explode('|', $tekst);
  17. ?>

wtedy bedziesz miał $tekst podzielone
mxm
A jeśli nie mam takiej możliwości, a tekst jest ściągany ze stronki internetowej?questionmark.gif
Black-Berry
zczytuj po linijce i sprawdzaj czy tekst przed pierwszą kropka jest liczbą.
mxm
Tzn. jak czytac i jednocześnie sprawdzać warunek?? Wyjaśnij to precyzyjniej...

Ma ktoś jeszcze jakieś inne pomysły??
Black-Berry
Najpierw musisz wykryć znaki końca linii bo to nie jest plik tylko 1 zmienna. Za pomocą wspomnianego wczesniej explode podziel tekst. Powinno się udać podzielić ze względu na "\n". (Ale nie jestem pewien. Moze ktoś coś podpowie)
  1. <?php
  2. $linijki = explode("\n", $text);
  3. ?>


Następnie:
  1. <?php
  2. foreach (linijki as $linijka) {
  3. //tu musisz wykryć pierwszą kropkę w linijce; spróbuj moze napisac sobie taką funk
    cję;
  4. $pozycjaPierwszejKropki = pozPK($linijka);
  5. //jak juz znasz pozycję zczytujesz wszystko do tego znaku
  6. $początkoweZnaki = pZnaki($pozycjaPierwszejKropki);
  7. //wykrywasz teraz czy te znaki to liczba
  8. if (liczba(początkoweZnaki)) {
  9. //zapisz bufor
  10. $podział[] = $buffor;
  11. } else {
  12. //dodaj do bufora
  13. $buffor[] = $linijka;
  14. }
  15. }
  16. ?>

To nie jest moze takie proste ale do zrobienia. Ktoś może wymyśli cos 'kultralniejszego'. To jest wersja bez myslenia bo już późno i mi się kręci w głowie smile.gif)
mxm
Nie chodzi mi o coś aż tak skomplikowanego.
Dlatego też szukałem rozwiązania za pomocą wyrażeń regularnych...

Co takiego można zrobić odczytując np. plik za pomocą file() i tam już tworzona jest tabela z osobnymi wierszami. Możnaby to przeszukiwać ręcznie (tzn każdy wiersz sprawdzać osobno wyrażeniem regularnym), ale to trochę pracochłonne i mało praktyczne. Nie ma prostszego sposobu?
Black-Berry
Jest, ale musisz być pewien ze np pusta linia odziela wpisy. Wtedy mozesz okroic moj algorytm do

  1. <?php
  2. foreach (linijki as $linijka) {
  3. if ($linijka jest pusta) {
  4. //zapisz bufor
  5. $podział[] = $buffor;
  6. } else {
  7. //dodaj do bufora
  8. $buffor[] = $linijka;
  9. }
  10. }
  11. ?>
mxm
To nie to o co mi chodziło, ale sposób działa. Poradziłem sobie w ten sposób ze plik zaimportowałem jako file() i potem każdy wiersz tabeli sprawdzałem pod obecność właścnie liczby 101., 102., 103., za pomocą preg_match, bo jak pisałem wcześniej pusta linia nie rozdziela całego tekstu na poszczególne części. Tak jak pisałeś zapisuje poszczególne częsci do bufora i potem łącze linijki tabel w jednolity tekst dla poszczególnych częsci. Jest jednak trochę rozwiązanie na około.

Nie można tego zrealizować jakoś prościej dzielenia tekstu bezpośrednio na całym tekście zawierającym znaki nowej linii?questionmark.gif
dyniaq
A próbowałeś funkcji: preg_split() z odpowiednim wyrażeniem regularnym? Tylko problem będzie w tym, że usunie wtedy 101. 102. itp. Ale coś pokombinuj jeszcze, a na pewno się uda :] Powodzenia

Manual: preg_split()
zimi
  1. <?php
  2. preg_match_all ("/(d{3}.*?)/s",$tresc , $wynik);
  3. ?>

nie wiem co to za flaga s ale zakładam że nie będzie przeszkadzać...
regularka zadziała pod warunkiem że w tekście po tej liczbie nie będzie innej 3-cyfrowej lub większej liczby
mxm
Cytat(dyniaq @ 12.07.2008, 08:53:08 ) *
A próbowałeś funkcji: preg_split() z odpowiednim wyrażeniem regularnym? Tylko problem będzie w tym, że usunie wtedy 101. 102. itp. Ale coś pokombinuj jeszcze, a na pewno się uda :] Powodzenia

Manual: preg_split()

O to chodziło - DZIĘKI. No nawet nie wiedziałem, że ta funkcja może tak wspaniale pracować biggrin.gif Wielki dzięki za pomoc, o to mi właśnie chodziło smile.gif

Rzeczywiście funkcja wycina te fragmenty, którymi rodziela tekst, ale akurat w moim przypadku nie były mi te fragmenty potrzebne smile.gif

Cytat(zimi @ 12.07.2008, 09:01:26 ) *
  1. <?php
  2. preg_match_all ("/(d{3}.*?)/s",$tresc , $wynik);
  3. ?>

nie wiem co to za flaga s ale zakładam że nie będzie przeszkadzać...
regularka zadziała pod warunkiem że w tekście po tej liczbie nie będzie innej 3-cyfrowej lub większej liczby

To nie działa. Sam przecież w pierwszym poście to napisałem...
zimi
Twoja regularka się trochę różniła ale rzeczywiście też nie działała, mój błąd
(się poprawię...) można zrobić taką regularkę:
  1. <?php
  2. preg_match_all ("#(d{3})(.*?)(?=(d{3}|$))#s",$tekst , $wynik);
  3. ?>

ale to raczej dla sportu niż dla wygody
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.