Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> podział tekstu z powtarzającymi się elementami, preg_match, preg_match_all, preg_split - czego użyć?
rycy85
post 17.07.2008, 20:58:11
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 16.07.2008

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


Witam wszystkich,
mam tekst który wygląda tak:
START coś1 STOP
START coś2STOP
START c
o
ś3 STOP

czyli mam początek i koniec powtarzającego się tekstu. Między nimi jest różna ilość linijek. Chodzi mi o to żeby w tablicy $array znajdowały się poszczególne elementy:
coś1
coś2
c
o
ś3

Jestem już bezradny bo preg_match_all wyszukuje od pierwszego START do ostatniego STOP sad.gif

Może mi ktoś napisać jak to zrobić? Z góry dzięki.

Pozdrawiam,
rycy
Go to the top of the page
+Quote Post
MMX3
post 17.07.2008, 21:04:06
Post #2





Grupa: Zarejestrowani
Postów: 155
Pomógł: 9
Dołączył: 26.01.2004
Skąd: Poznań

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


po pierwsze przeczytaj sobie tutorial na temat wyrażeń regularnych( zapytaj google o regexp).
jeżeli masz start i stop to sprawa jest bardzo prosta.
ja bym najpierw podzielił całość po "\n" (znak końca linii) a następnie poruszał się po tablicy i szukał wzorca.


--------------------
Go to the top of the page
+Quote Post
rycy85
post 17.07.2008, 21:23:16
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 16.07.2008

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


Cytat(MMX3 @ 17.07.2008, 22:04:06 ) *
po pierwsze przeczytaj sobie tutorial na temat wyrażeń regularnych( zapytaj google o regexp).
jeżeli masz start i stop to sprawa jest bardzo prosta.
ja bym najpierw podzielił całość po "\n" (znak końca linii) a następnie poruszał się po tablicy i szukał wzorca.


myślałem o czymś takim:
Kod
preg_split ("|START(.*)STOP|s", $input_string)

ale to chyba też zaczyna od pierwszego START i wyszuka do ostatniego STOP;/ nie ma jakiegoś prostszego sposobu?
niestety tego tekstu w ogóle nie mogę edytować;/
Go to the top of the page
+Quote Post
Virti
post 17.07.2008, 21:36:50
Post #4





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

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


Sorry, ale wydaje mi się, że da się bez wyrażen regularnych:
  1. <?
  2. //w zmiennej $text masz ten swój kod
  3. $text = explode("\n", $text);
  4.  
  5. $parsed = array();
  6. foreach($text as $line)
  7. {
  8.  $parsed[] = str_replace(array("START", "STOP"), null, $line);
  9. }
  10. ?>


Pisane z palca, więc może być jakiś błąd...

EDIT: Oczywiście w zmiennej $parsed masz tablicę z liniami, czyli chyba to, o co chodziło...

Ten post edytował Virti 17.07.2008, 21:38:18
Go to the top of the page
+Quote Post
zimi
post 17.07.2008, 21:37:30
Post #5





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

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


bo wyrażenia regularne są zachłanne! zamiast .* wpisz .*? i użyj preg_match_all

Ten post edytował zimi 17.07.2008, 21:41:30
Go to the top of the page
+Quote Post
Virti
post 17.07.2008, 21:44:09
Post #6





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

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


  1. <?
  2. $text = 'START coś1 STOP
  3. START coś2STOP
  4. START c
  5. o
  6. ś3 STOP';
  7.  
  8. $text = explode("\n", $text);
  9.  
  10. $parsed = array();
  11. foreach($text as $line)
  12. {
  13.  $parsed[] = str_replace(array("START", "STOP"), null, $line);
  14. }
  15.  
  16. var_dump($parsed);
  17. ?>

Wyrzuca:
Kod
array(5) { [0]=> string(8) " coś1 " [1]=> string(7) " coś2 " [2]=> string(3) " c " [3]=> string(2) "o " [4]=> string(4) "ś3 " }

Nie o to chodziło? winksmiley.jpg

Pozdrawiam.

EDIT: Dla ładniejszych wyników dodaj jeszcze f-cję trim();

Ten post edytował Virti 17.07.2008, 21:45:16
Go to the top of the page
+Quote Post
rycy85
post 17.07.2008, 21:44:23
Post #7





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 16.07.2008

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


no niestety wyniki w ogóle się rozjeżdżają;/

nie da się tego jakoś inaczej?
Go to the top of the page
+Quote Post
Virti
post 17.07.2008, 21:48:48
Post #8





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

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


rozjeżdżają, tzn?

zamień

  1. <?php
  2. $parsed[] = str_replace(array("START", "STOP"), null, $line);
  3. ?>


na:

  1. <?php
  2. $parsed[] = trim(str_replace(array("START", "STOP"), null, $line));
  3. ?>


Ten post edytował Virti 17.07.2008, 21:49:12
Go to the top of the page
+Quote Post
rycy85
post 17.07.2008, 21:58:20
Post #9





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 16.07.2008

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


wpisałem coś takiego:
Kod
$result = explode("\n", $result);

$parsed = array();
foreach($result as $line)
{
   $parsed[] = trim(str_replace(array("<font style='font-size: 11px'>", "<img src='http://domain.pl/10541/gfx/spacer.gif' width=1 height=1></td>"), null, $line));
}
echo $parsed[0];

i niestety nic - nie wiem, może źle to wyświetlam?
Go to the top of the page
+Quote Post
Virti
post 17.07.2008, 22:03:58
Post #10





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

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


sprawdź, czy var_dump($parsed); coś wyświetli, być może, że akurat przy "zerze" nic nie było...

a najlepiej daj jeszcze var_dump($result);
Go to the top of the page
+Quote Post
zimi
post 17.07.2008, 22:09:28
Post #11





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

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


@rycy85: Jakich wyników oczekujesz?
Go to the top of the page
+Quote Post
doseo
post 17.07.2008, 22:17:57
Post #12





Grupa: Zarejestrowani
Postów: 28
Pomógł: 3
Dołączył: 23.01.2007
Skąd: Dys/Lublin

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


Cytat(zimi @ 17.07.2008, 22:37:30 ) *
bo wyrażenia regularne są zachłanne! zamiast .* wpisz .*? i użyj preg_match_all


Słusznie mówisz, ale trzeba kod zapodać:)

  1. <?php
  2. $tekst = "START coś1 STOP
  3. START coś2STOP
  4. START c
  5. o
  6. ś3 STOP";
  7.  
  8. preg_match_all( '|START(.*?)STOP|s', $tekst, $wynik );
  9.  
  10. print_r( $wynik ); 
  11. ?>
Go to the top of the page
+Quote Post
zimi
post 17.07.2008, 22:21:50
Post #13





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

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


OT:
Cytat
Słusznie mówisz, ale trzeba kod zapodać:)

Nie załamuj mnie znak zapytania chyba każdy potrafi dodać...
Go to the top of the page
+Quote Post
rycy85
post 17.07.2008, 22:33:27
Post #14





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 16.07.2008

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


Cytat(Virti @ 17.07.2008, 23:03:58 ) *
sprawdź, czy var_dump($parsed); coś wyświetli, być może, że akurat przy "zerze" nic nie było...

a najlepiej daj jeszcze var_dump($result);


var_dump($parsed) wyświetla to samo co var_dump($result) czyli całą tekst w tablicy podzielony na linijki.
natomiast $parsed[nr_linijki] wyświetla zawartość tej linijki. Czy tu jest wzięte pod uwagę że START i STOP są w różnych linijkach?

przez wyrażenia regularne jakoś by tego nie dało się zrobić? Może wiesz jaki trzeba warunek postawić w wyrażeniu aby szukał do najbliższego STOP?

cholera nie zauważyłem pierwszego postu zimiego
tak to działa .*? zamiast .*

sorka - gdzieś mi umknął ten post jak sprawdzałem metodę z str_replace

dzięki za pomoc
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: 12.07.2025 - 12:36