Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne][RegExp]
Forum PHP.pl > Forum > Przedszkole
kokolis
Moim celem jest wyłowienie z ciągu

  1. aaa(xxx),
  2. aaa(ddd) ,
  3. aaa(xx(wyrazenie1)xx),
  4. aaa(www),
  5. aaa(ww(wyrazenie2)s)


wszystkich zawartości z pomiędzy

  1. aaa(


i

  1. )


Niestety, wewnątrz a(...) mogą wystąpić wyrazenia otoczone nawiasami (są tylko dwie takie mozliwosci - (wyrazenie1) i (wyrazenia2)). Pomimo licznych prób nie udalo mi się napisać wzorca który pasowałby do przytoczonego przykładu. Bardzo prosiłbym choćby o jakieś wskazówki.
flashdev
  1. <?php
  2.  
  3. $str = 'aaa(xx(wyrazenie1)xx)';
  4. preg_match('/aaa\((.*)\)/', $str, $matches);
  5.  
  6. var_dump($matches);
  7.  
  8. fgets(STDIN);


O to chodzi?
kokolis
Prawie o to smile.gif

Podana przez Ciebie instrukcja dostarczy mi ciąg

  1. xx(wyrazenie1


a tymczasem rozchodzi się o

  1. xx(wyrazenie1)xx
Wicepsik
Wartości są zawsze oddzielone przecinkiem ?
kokolis
Jesli pytasz o odstępy pomiędzy aaa(..) i kolejnym aaa() to tak, z wyjątkiem ostatniego.

Jednakowoż jeśli jest to jakiś problem moge to zmienić albo całkowicie pozbyć się odstepu pomiedzy nimi - jesli to moze cos pomóc.
flashdev
Cytat(kokolis @ 23.10.2010, 15:39:12 ) *
Prawie o to smile.gif
[...]


  1. <?php
  2.  
  3. $str = <<<HD
  4. aaa(xxx),
  5. aaa(ddd) ,
  6. aaa(xx(wyrazenie1)xx),
  7. aaa(www),
  8. aaa(ww(wyrazenie2)s)
  9. HD;
  10.  
  11. preg_match_all('/aaa\((.*)\)/', $str, $matches);
  12.  
  13. var_dump($matches[1]);
  14.  
  15. fgets(STDIN);
kokolis
Cytat
Notice: Use of undefined constant STDIN


Aczkolwiek, zwracane wyniki są w porzadku. Dziękuję. Mógłbyś mi jeszcze tak szybko powiedziec coż to za tajemnicza STDIN i jak to zrobiłeś?
flashdev
Cytat(kokolis @ 23.10.2010, 16:02:43 ) *
Aczkolwiek, zwracane wyniki są w porzadku. Dziękuję. Mógłbyś mi jeszcze tak szybko powiedziec coż to za tajemnicza STDIN i jak to zrobiłeś?


Żadna tajemnica, wszyscy o tym wiedzą nawet google -> http://www.google.pl/search?client=opera&a...-8&oe=utf-8 winksmiley.jpg

Edit:
Oczywiście ostatnia instrukcja jest tutaj zupełnie niepotrzebna. Dodaję ją tylko po to, żeby mieć więcej czasu niż ułamek sekundy na obejrzenie wyników w konsoli.
kokolis
Z tego co wyczytałem STDIN nie odgrywa tu większej roli. Jakim cudem Twoje wyrażenie pomija nawiasy wewn. nawiasów? Jak to możliwe bez żadnych dod. instrukcji?
flashdev
Cytat(kokolis @ 23.10.2010, 16:07:28 ) *
Z tego co wyczytałem STDIN nie odgrywa tu większej roli. Jakim cudem Twoje wyrażenie pomija nawiasy wewn. nawiasów? Jak to możliwe bez żadnych dod. instrukcji?


Nie pomija, tylko dopasowuje do wzorca, jakim jest znak kropki ("." - pasuje do wszystkiego).
kokolis
Ale dlaczego pomija nawias przy (wyrazenie1), a akceptuje ten po a(...). Idąc Twoim tokiem rozumowania powinienem znaleźć tylko jedno pasujące rozwiązanie i uzyskać zawartość spośród a( i ostatnim nawiasem, otrzymując wszystkie inne a(...) wewnątrz.

Ano właśnie, już wiem. Ciąg nie ma postaci linijka pod linijką. Napisałem tak tylko dla uproszeczenia. Dlatego Twoje instrukcje działają bez zarzutu. W jaki sposób mogę poradzić sobie z ciągiem

  1. aaa(...), aaa(...)
flashdev
Cytat(kokolis @ 24.10.2010, 09:31:51 ) *
Ale dlaczego pomija nawias przy (wyrazenie1), a akceptuje ten po a(...). Idąc Twoim tokiem rozumowania powinienem znaleźć tylko jedno pasujące rozwiązanie i uzyskać zawartość spośród a( i ostatnim nawiasem, otrzymując wszystkie inne a(...) wewnątrz.

Ano właśnie, już wiem. Ciąg nie ma postaci linijka pod linijką. Napisałem tak tylko dla uproszeczenia. Dlatego Twoje instrukcje działają bez zarzutu. W jaki sposób mogę poradzić sobie z ciągiem

  1. aaa(...), aaa(...)


Dokładnie o to chodzi. Zobacz jaka będzie różnica po dodaniu flagi "s".
  1. preg_match_all('/aaa\((.*)\)/s', $str, $matches);


Do powyższego ciągu możesz użyć ponizszego kodu.

  1. <?php
  2.  
  3. $str = <<<HD
  4. aaa(xxx),aaa(ddd) ,aaa(xx(wyrazenie1)xx),aaa(www),aaa(ww(wyrazenie2)s)
  5. HD;
  6.  
  7. preg_match_all('/aaa\(([^,]*)\)/', $str, $matches);
  8.  
  9. var_dump($matches[1]);
  10.  
  11. fgets(STDIN);


Będzie działać, dopóki w nawiasie nie będzie przecinków.
kokolis
Niestety wewnątrz moga pojawić się przecinki :/
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.