Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Podział tekstu zawierajacy powtarzające się znaki, Tekst posiada nowe linie "\n"
mxm
post
Post #1





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

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


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ą...

Ten post edytował mxm 11.07.2008, 22:55:01
Go to the top of the page
+Quote Post
Mlodycompany
post
Post #2





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


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
Go to the top of the page
+Quote Post
mxm
post
Post #3





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

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


A jeśli nie mam takiej możliwości, a tekst jest ściągany ze stronki internetowej?questionmark.gif
Go to the top of the page
+Quote Post
Black-Berry
post
Post #4





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


zczytuj po linijce i sprawdzaj czy tekst przed pierwszą kropka jest liczbą.


--------------------
Go to the top of the page
+Quote Post
mxm
post
Post #5





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

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


Tzn. jak czytac i jednocześnie sprawdzać warunek?? Wyjaśnij to precyzyjniej...

Ma ktoś jeszcze jakieś inne pomysły??

Ten post edytował mxm 11.07.2008, 22:17:21
Go to the top of the page
+Quote Post
Black-Berry
post
Post #6





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


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)


--------------------
Go to the top of the page
+Quote Post
mxm
post
Post #7





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

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


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?

Ten post edytował mxm 11.07.2008, 22:49:31
Go to the top of the page
+Quote Post
Black-Berry
post
Post #8





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


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. ?>


Ten post edytował Black-Berry 11.07.2008, 23:37:01


--------------------
Go to the top of the page
+Quote Post
mxm
post
Post #9





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

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


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
Go to the top of the page
+Quote Post
dyniaq
post
Post #10





Grupa: Zarejestrowani
Postów: 34
Pomógł: 4
Dołączył: 31.07.2006
Skąd: Oława

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


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()

Ten post edytował dyniaq 12.07.2008, 09:53:50


--------------------
~ kim jest Ta, co mi w oczach zasadza takie drzewo? ~
Go to the top of the page
+Quote Post
zimi
post
Post #11





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


  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
Go to the top of the page
+Quote Post
mxm
post
Post #12





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 9.06.2005

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


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...

Ten post edytował mxm 13.07.2008, 17:56:50
Go to the top of the page
+Quote Post
zimi
post
Post #13





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


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
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 Aktualny czas: 21.08.2025 - 14:22