Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wielolinijkowe wyrażenia regularne
Forum PHP.pl > Forum > Przedszkole
dawidoff86
Witam!
Mam problem z napisaniem wyrażenie regularnego, które znajdowało by tekst, mający kilka linijek, a mianowicie, coś w stylu:
  1. <tag>
  2. tekst1
  3. tekst2
  4. tekst3
  5. ...
  6. tekst
  7. </tag>

próbowałem jakoś łączyć .* i ("\r\n"), ale jakoś mi to nie wychodziło. mógłby mi ktoś pomóc, bym mógł uzyskać wyrażenie, które można podstawić do funkcji preg_match questionmark.gif
Fifi209
  1. <?php
  2.  
  3. $string = '<tag>
  4. asdf
  5. sd
  6. fs
  7. df
  8. sdf
  9. </tag>';
  10.  
  11. preg_match('#<tag>(.*)</tag>#is', $string, $matches);
  12.  
  13. echo '<pre>';
  14. print_r($matches);
  15.  
  16. ?>
dawidoff86
już trochę bliżej tego co chcę osiągnąć, jednak w sytuacji jaką mam tzn:
  1. <tag>
  2. tekst
  3. tekst
  4. tekst
  5. </tag>
  6. <tag>
  7. tekst
  8. tekst
  9. </tag>

znaleziono tylko jedno pasujące rozwiązanie, zawierające cały ten łańcuch. a mi chodzi by każde wyrażenie ograniczone <tag></tag> stanowiło oddzielne rozwiązanie i zostało umieszczone w oddzielnych polach tablicy.
Fifi209
preg_match_all
dawidoff86
no właśnie nie w tym rzecz.
wyrażenie nie działa tak jak powinno. kod
  1. $string = '<tag>
  2. tekst1
  3. tekst1
  4. tekst1
  5. </tag>
  6. <tag>
  7. tekst2
  8. tekst2
  9. </tag>';
  10.  
  11. preg_match_all('#<tag>(.*)</tag>#is', $string, $matches);
  12. echo '<pre>';
  13. print_r($matches);

daje w rezultacie:
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [0] =>
  6. tekst1
  7. tekst1
  8. tekst1
  9.  
  10.  
  11. tekst2
  12. tekst2
  13.  
  14. )
  15.  
  16. [1] => Array
  17. (
  18. [0] =>
  19. tekst1
  20. tekst1
  21. tekst1
  22.  
  23.  
  24. tekst2
  25. tekst2
  26.  
  27. )
  28.  
  29. )

zamiast
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [0] =>
  6. tekst1
  7. tekst1
  8. tekst1
  9. )
  10.  
  11. [1] => Array
  12. (
  13. [0] =>
  14. tekst2
  15. tekst2
  16. )
  17.  
  18. )
Wicepsik
  1. $string = '<tag>
  2. tekst1
  3. tekst1
  4. tekst1
  5. </tag>
  6. <tag>
  7. tekst2
  8. tekst2
  9. </tag>';
  10.  
  11. preg_match_all('#<tag>[^<]</tag>#is', $string, $matches);
  12. echo '<pre>';
  13. print_r($matches);
dawidoff86
niestety, nie znajduje dopasowania, wynik to:
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. )
  6.  
  7. )

podobnie jak
  1. preg_match_all('#<tag>[^<]<\/tag>#is', $string, $matches);

sciana.gif
Fifi209
Cytat(Wicepsik @ 3.03.2010, 15:37:12 ) *
  1. $string = '<tag>
  2. tekst1
  3. tekst1
  4. tekst1
  5. </tag>
  6. <tag>
  7. tekst2
  8. tekst2
  9. </tag>';
  10.  
  11. preg_match_all('#<tag>[^<]</tag>#is', $string, $matches);
  12. echo '<pre>';
  13. print_r($matches);

W ogóle nie będzie działało. winksmiley.jpg

Jak już to:
  1. preg_match_all('#<tag>([^<]+)</tag>#is', $string, $matches);
dawidoff86
to już działa tak jak powinno. jednak nadal mam jeszcze jedno pytanie,
dlaczego po zmianie treści stringa na bardziej złożoną
  1. $string = '<div class="details">
  2. <strong>Ĺšroda</strong><br />
  3. 3°C/-5°C<br />
  4. <span class="precipitation">30%</span><br />
  5. 33 km/h<br />
  6. MarznÄ?ce opady
  7. </div>
  8. </li>
  9. </ul>
  10. <ul>
  11. <li>
  12. <img src="/images/WeatherGroups/10s.png" border="0">';


analogiczne wyrażenie:
  1. preg_match_all('#<div class="details">([^<]+)</div>#is', $string, $matches);

nie działa (zwraca pusty wynik).
Fifi209
Cytat(dawidoff86 @ 3.03.2010, 16:25:45 ) *
to już działa tak jak powinno. jednak nadal mam jeszcze jedno pytanie,
dlaczego po zmianie treści stringa na bardziej złożoną


([^<]+) - to oznacza dowolne znaki w dowolnej ilości z wyłączeniem <

Czyli pojawia się znak < i już nie pasuje do wyrażenia.
Wicepsik
  1. $string = '<div class="details">
  2. <strong>Ĺšroda</strong><br />
  3. 3°C/-5°C<br />
  4. <span class="precipitation">30%</span><br />
  5. 33 km/h<br />
  6. MarznÄ?ce opady
  7. </div>
  8. </li>
  9. </ul>
  10. <ul>
  11. <li>
  12. <img src="/images/WeatherGroups/10s.png" border="0">';
  13.  
  14. preg_match_all('#<div class="details">(.*)(</div>).#is', $string, $matches);
  15. echo '<pre>';
  16. print_r($matches);
dawidoff86
  1. preg_match_all('#<div class="details">(.*)(</div>).#is', $string, $matches);

to już trochę bliżej rozwiązania, jednak w przypadku gdy istnieje w tekście kilka wyrażeń ograniczonych przez <div class="details>...</div> np
  1. $string = '<div class="details">
  2. <strong>Ĺšroda</strong><br />
  3. 3°C/-5°C<br />
  4. <span class="precipitation">30%</span><br />
  5. 33 km/h<br />
  6. MarznÄ?ce opady
  7. </div>
  8. </li>
  9. </ul>
  10. <ul>
  11. <li>
  12. <img src="/images/WeatherGroups/10s.png" border="0">
  13. <div class="details">
  14. <strong>Czwartek</strong><br />
  15. 5°C/9°C<br />
  16. <span class="precipitation">30%</span><br />
  17. 50 km/h<br />
  18. Śnieg
  19. </div>
  20. </li>
  21. </ul>
  22. <ul>
  23. <li>
  24. <img src="/images/WeatherGroups/10s.png" border="0">
  25. ';

to w takim przypadku Twój kod znajduje tylko jedno dopasowanie, a moim celem jest, aby znalazł dwa osobne.
pablo89pl
  1. preg_match_all('/<tag>(.*?)</tag>/is', $string, $matches);


dodając ? wyłączasz zachłanność(greedy)
dawidoff86
tak o to chodziło, tylko zamiast
  1. preg_match_all('/<tag>(.*?)</tag>/is', $string, $matches);

użyłem:
  1. preg_match_all('#<tag>(.*?)</tag>#is', $string, $matches);
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.