Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Wyrażenia regularne]
Forum PHP.pl > Forum > PHP
Astan
Witam,

zacząłem naukę z wyrażeniami regularnym, jestem osoba początkującą i mam pewien problem z wycągnięciem treści.
Z niżej podanego kodu potrzebuję wyciągnąć adres http ze znacznika img oraz treść, która znajduje się w znacznikach <b>treść</b>

  1. <tr class="odd">
  2. <td><a href="/user/captcha/103134708">
  3. <img src="http://static.deathbycaptcha.com/captchas/3464a54d292503e03cbaff0a8d45d9f3f2252905" alt="" />
  4. </a></td>
  5. <td>Thu Feb 19 07:02:09 2015</td>
  6. <td>
  7. <b>ndeps</b>
  8. <form name="captcha-103134708-report-form"
  9. action="/user/captcha/103134708/report"
  10. method="post">
  11. <button type="submit">Report incorrect result</button>
  12. </form>
  13. </td>
  14. </tr>
  15. <tr class="even">
  16. <td><a href="/user/captcha/103134675">
  17. <img src="http://static.deathbycaptcha.com/captchas/438b736f601416a42945d8de9711d542767ebfb3" alt="" />
  18. </a></td>
  19. <td>Thu Feb 19 07:02:09 2015</td>
  20. <td>
  21. &mdash;
  22. </td>
  23. </tr>
  24. <tr class="odd">
  25. <td><a href="/user/captcha/103134206">
  26. <img src="http://static.deathbycaptcha.com/captchas/5cc88aad3a5c322c248dde17598edb7670f7efed" alt="" />
  27. </a></td>
  28. <td>Thu Feb 19 07:02:01 2015</td>
  29. <td>
  30. <b>anesp</b>
  31. <form name="captcha-103134206-report-form"
  32. action="/user/captcha/103134206/report"
  33. method="post">
  34. <button type="submit">Report incorrect result</button>
  35. </form>
  36. </td>
  37. </tr>


Prosiłbym o pomoc w rozwiązaniu problemu lub nakierowanie na poprawne rozwiązanie.

o to mój kawałek kodu
  1. preg_match("/<img src="([^"]+)" alt=""\s\/>.*?<b>([^<]+)<\/b>/" .... );
nospor
Poki co to Twoj problem to nie jest z wyrazeniami ale z podstawami obslugi tekstow....

Jak tekst rozpoczynasz cudzyslowiem, to nie mozesz sobie od ta do tego tekstu wlożyc cudzysłowa. Lektura obowiązkowa
http://php.net/manual/en/language.types.string.php
Astan
  1. preg_match('/<img src="([^"]+)" alt=""\s\/>.*?<b>([^<]+)<\/b>/' .... );


przepisując kod tutaj nie zwróciłem uwago na to że powinien być apostrof.
Jest ktoś w stanie mi pomóc rozwiąc mój problem ?
Wazniak96
Cytat(Astan @ 24.02.2015, 12:25:09 ) *
  1. preg_match('/<img src="([^"]+)" alt=""\s\/>.*?<b>([^<]+)<\/b>/' .... );


przepisując kod tutaj nie zwróciłem uwago na to że powinien być apostrof.
Jest ktoś w stanie mi pomóc rozwiąc mój problem ?

Serio go przepisujesz czy próbujesz ciemnotę wcisnąć ? wink.gif
jackraymund
  1. '/<img src="([^"]+)" alt=""\s\/>.*?<b>([^<]+)<\/b>/is'

wszystko wyglada elegancko, dodalem tylko flagi case sensitive i aby kropka odpowiadała za białe znaki.(case sensitive niby niepotrzebne, ale zazwyczaj dodaje do regexpa, w razie zmian)
Jedynie poprawisz to ci ci powiedział nospor
Astan
Zacząłem to testowac na stronie regular exspression, link do przykładu https://www.regex101.com/r/hM5sF1/1

Nie wyciąga mi jednego adresu z img, który znajduje się na ciemnym niebieskim polu.
<img src="http://static.deathbycaptcha.com/captchas/5cc88aad3a5c322c248dde17598edb7670f7efed" alt="" />

Czy ktoś wie jak mogę to poprawić ?
kreatiff
Nie wyciąga Ci tego adresu, ponieważ nie następuje po nim tekst w znacznikach <b>...</b>. Tzn, wyciąga prawidłowo, ponieważ pobiera adres z img src, na który natrafia, ale potem szuka tekstu w znaczniku <b>. A że taki tekst znajduje się dopiero w kolejnym rzędzie tabeli, za kolejnym adresem w img src, to niestety ten właśnie adres zostaje pominięty.
Podsumowując, pominięte zostaną wszystkie adresy, dla których w danym rzędzie tabeli nie występuje pogrubiony tekst.

Więc by to poprawić najlepiej byłoby rozpisać we wzorze wszystkie możliwe układy znaczników w rzędzach tabeli źródłowej. Wówczas jak coś się pojawi to się to wyłapie, a jak nie to ominie.

Dla tego konkretnego wycinka danych można je wyciągać np. tym:
  1. preg_match_all('#<img src="(.*?)".*?(?>(?:<b>(.*?)</b>|&mdash;))#su', $wsad, $trafienia);
Ten wzór zakłada, że w rzędzie występuje albo pogrubiony tekst, albo encja (myślnik). Łapany jest albo pogrubiony tekst, gdy występuje, albo pusty string, gdy tego tekstu brak.
Astan
Dziękuję za pomoc i na nakierowanie w rozwiązaniu problemu. Musiałem trochę zmodyfikować podany kod
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.