Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: podział tekstu z powtarzającymi się elementami
Forum PHP.pl > Forum > PHP
rycy85
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
MMX3
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.
rycy85
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ć;/
Virti
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...
zimi
bo wyrażenia regularne są zachłanne! zamiast .* wpisz .*? i użyj preg_match_all
Virti
  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();
rycy85
no niestety wyniki w ogóle się rozjeżdżają;/

nie da się tego jakoś inaczej?
Virti
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. ?>
rycy85
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?
Virti
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);
zimi
@rycy85: Jakich wyników oczekujesz?
doseo
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. ?>
zimi
OT:
Cytat
Słusznie mówisz, ale trzeba kod zapodać:)

Nie załamuj mnie znak zapytania chyba każdy potrafi dodać...
rycy85
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
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.