Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wycinanie ciągu znaków
Forum PHP.pl > Forum > Przedszkole
patrysiek2
Niby tyle tematów w sieci, ale nie mogą skumać jak wyciąć test od jakiegoś do jakiegoś momentu.

Mógłby ktoś pomóc jak wyciąć z tego:
  1. <a href="http://moja-strona.pl/coś?.target=wycinam123&src=pg">


Chciałbym, aby wyciąć z tego tylko
Od
target=wycinam
do
&src=pg


więc wynikiem powinno być:
123

Nie wiem jak to rozwiązać, tutaj jakieś moje bazgroły:
  1. $page = curl_exec($ch);
  2. curl_close($ch);
  3. preg_match_all("|target=dsgbw(.*)&.src=pg|", $page, $cute);
  4. print_r($cute);
mstraczkowski
Możesz spróbować chociażby w taki spoósb

  1. <?php
  2. $matches = array();
  3. $value = '<a href="http://moja-strona.pl/coś?.target=wycinam123&src=pg">';
  4.  
  5. preg_match_all('/(\d+)&src/', $value, $matches);
  6. print_r($matches);
patrysiek2
Niby działa jako przykład, ale, gdy robię coś takiego:
  1. $ch = curl_init($config['address'].'memberlist.php?mode=viewprofile&u='.$id);
  2. curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
  3. curl_setopt($ch, CURLOPT_HEADER, true);
  4. curl_setopt($ch, CURLOPT_COOKIEFILE, $path['cookie']);
  5. curl_setopt($ch, CURLOPT_COOKIEJAR, $path['cookie']);
  6. curl_setopt($ch, CURLOPT_POSTFIELDS, prepare_request($post));
  7. $page = curl_exec($ch);
  8. curl_close($ch);
  9.  
  10. $matches = array();
  11. preg_match_all('/(\d+)&src/', $page, $matches);
  12. print_r($matches);
  13.  

to niestety zwraca mi dwie puste tablice (?)

Kod
Array ( [0] => Array ( ) [1] => Array ( ) )
mstraczkowski
Musisz mi pokazać przykładową zawartość zmiennej $page, bo w kodzie jej nie widać, gdyż jest uzyskiwana przez cURL.
patrysiek2
To wrzucę cały kodzik:
  1. <head>
  2. <title>Devsite - testy</title>
  3. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. </head>
  5. <?php
  6. echo "<center><b>Devsite - Waski</b></center>";
  7.  
  8. $config['address'] = 'http://forum.taern.pl/';
  9. $path['cookie'] = dirname(__FILE__).'/cookies.txt';
  10. $id = 680;
  11. $post['username'] = 'dsgbw';
  12. $post['password'] = '*****';
  13. $post['redirect'] = './memberlist.php?mode=viewprofile&u='.$id;
  14. $post['login'] = 'Zaloguj się';
  15.  
  16.  
  17. $ch = curl_init($config['address'].'memberlist.php?mode=viewprofile&u='.$id);
  18. curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
  19. curl_setopt($ch, CURLOPT_HEADER, true);
  20. curl_setopt($ch, CURLOPT_COOKIEFILE, $path['cookie']);
  21. curl_setopt($ch, CURLOPT_COOKIEJAR, $path['cookie']);
  22. curl_setopt($ch, CURLOPT_POSTFIELDS, prepare_request($post));
  23.  
  24. $page = curl_exec($ch);
  25. curl_close($ch);
  26.  
  27. preg_match_all('/(\d+)&src/', $page, $matches);
  28. print_r($matches);
  29.  
  30.  
  31.  
  32. // Funkcja pomocnicza
  33. function prepare_request($query)
  34. {
  35. if(is_array($query) && !empty($query))
  36. {
  37. foreach($query as $key => $value)
  38. {
  39. $query[$key] = urlencode($key).'='.urlencode($value);
  40. }
  41.  
  42. return implode('&', $query);
  43. }
  44. else
  45. {
  46. return false;
  47. }
  48. }
  49. ?>


Wszystko ładnie się loguje co można zobaczyć na http://devsite-waski.hol.es
mstraczkowski
Zacznijmy od tego, że w tym przypadku zmienna $page zawiera wartość boolean (true/false), a nie ciąg znaków.
Więc nic konkretnego za pomocą wyrażenia regularnego w tym nie znajdziesz.

Aby zawierała ciąg znaków (tj. zawartość HTML) musisz ustawić flagę CURLOPT_RETURNTRANSFER na wartość true
patrysiek2
Przestawiłem flagę CURLOPT_RETURNTRANSFER co niestety nic nie daje, efekt taki sam :/
Nie mam zielonego pojęcia co robić.
mstraczkowski
Zrób var_dump na tej zmiennej $page i pokaż co ona zawiera.
Dodatkowo podaj, co tak naprawdę chcesz otrzymać.
patrysiek2
Na stronce teraz jest z var_dump i pokazuję stronę, podobnie jakbym użył
  1. echo $page;


Chcę otrzymać coś co jest zawarte w źródle strony.
Wycinek ze źródła:
  1. <a href="http://edit.yahoo.com/config/send_webmesg?.target=dsgbw71&amp;.src=pg" onclick="popup(this.href, 780, 550); return false"><img src="./styles/cs/imageset/icon_contact_yahoo.gif" width="33" height="13" alt="YIM" title="YIM"></a>


Wizualnie znajduje się to obok komunikatorów, w tym przypadku YIM
i chcę z tego otrzymać liczby zawarte między
.target=dsgbw a &amp;.src=pg
mstraczkowski
Spróbuj w taki sposób:

  1. <?php
  2. $matches = array();
  3. $value = '<a href="http://edit.yahoo.com/config/send_webmesg?.target=dsgbw71&.src=pg" onclick="popup(this.href, 780, 550); return false"><img src="./styles/cs/imageset/icon_contact_yahoo.gif" width="33" height="13" alt="YIM" title="YIM"></a>';
  4.  
  5. preg_match_all('/(\d+)\&\.src=/', $value, $matches);
  6. print_r($matches);

A jeżeli nie, to popróbuj sam, np za pomocą bardzo przyjemnego narzędzia do regexpów gSkinner
patrysiek2
Cytat(mstraczkowski @ 20.10.2013, 12:31:08 ) *
Spróbuj w taki sposób:

  1. <?php
  2. $matches = array();
  3. $value = '<a href="http://edit.yahoo.com/config/send_webmesg?.target=dsgbw71&.src=pg" onclick="popup(this.href, 780, 550); return false"><img src="./styles/cs/imageset/icon_contact_yahoo.gif" width="33" height="13" alt="YIM" title="YIM"></a>';
  4.  
  5. preg_match_all('/(\d+)\&\.src=/', $value, $matches);
  6. print_r($matches);

A jeżeli nie, to popróbuj sam, np za pomocą bardzo przyjemnego narzędzia do regexpów gSkinner


Kurcze działa przykład lecz gdy dam żeby wyciągało z $page to nie działa, a muszę mieć ze strony ponieważ będzie tam zmienna wartość.
SmokAnalog
Dziwnie kombinujecie. Najpierw wytnijcie wartość atrybutu:
  1. preg_match('#\s+href="(.*?)"#', $content, $match);

A dopiero potem bawcie się w wycinanie z tego liczb czy co tam potrzeba.
patrysiek2
Cytat(SmokAnalog @ 20.10.2013, 12:41:11 ) *
Dziwnie kombinujecie. Najpierw wytnijcie wartość atrybutu:
  1. preg_match('#\s+href="(.*?)"#', $content, $match);

A dopiero potem bawcie się w wycinanie z tego liczb czy co tam potrzeba.


Hmm, ale strona zawiera X takich hrefów więc zwraca mi

Array ( [0] => href="http://forum.taern.pl/feed.php" [1] => http://forum.taern.pl/feed.php )

SmokAnalog jak możesz to przejrzyj wcześniejsze posty i coś doradź bo... "musk" mi już siada.
SmokAnalog
No dobrze, to zacznę od mojego ulubionego pytania: co dokładnie chcesz zrobić? Dziwi mnie, kiedy ludzie wyskakują z gotowymi rozwiązaniami, kiedy problem nie jest wystarczająco opisany.

Podałeś jakiś przykład z tymi liczbami, ale jaki jest ogólny cel, opisz wszystkie przypadki i co ma się dziać.
patrysiek2
Cytat(SmokAnalog @ 20.10.2013, 13:09:30 ) *
No dobrze, to zacznę od mojego ulubionego pytania: co dokładnie chcesz zrobić? Dziwi mnie, kiedy ludzie wyskakują z gotowymi rozwiązaniami, kiedy problem nie jest wystarczająco opisany.

Podałeś jakiś przykład z tymi liczbami, ale jaki jest ogólny cel, opisz wszystkie przypadki i co ma się dziać.


Poprzez cURL pobierana jest strona i jest logowanie na nią.
Chcę wyciągnąć liczby zawarte między target=dsgbw a &.src=pg.
Lecz, gdy zmienna $id będzie miała inną wartość to liczba zawarta między ww znacznikami (?) może być inna i dlatego chcę zrobić tak:
1. Pobieranie strony przez cURL +
2. Logowanie na stronę +
3. Pobieranie liczby zawartej między target=dsgbw a &.src=pg -
Następnie pobrane liczby będę chciał zapisać do zmiennej, a później biblioteki GD itp.
SmokAnalog
Jeśli chcesz użyć tego tylko do takiego jednego przypadku, to można np. tak:
  1. preg_match_all('#href="[^"]*\?\.target=[^0-9"](\d+)&\.src=[^"]*"#', $content, $matches);

Mój przykład pobierze liczbę ze wszystkich atrybutów href, które mają w sobie ciąg ?.target=cośtamcośtamLICZBA&src=. Czy to wystarczy?

P.S. Pisałem z palca, mam nadzieję, że bez błędów smile.gif
patrysiek2
Cytat(SmokAnalog @ 20.10.2013, 13:35:40 ) *
Jeśli chcesz użyć tego tylko do takiego jednego przypadku, to można np. tak:
  1. preg_match_all('#href="[^"]*\?\.target=[^0-9"](\d+)&\.src=[^"]*"#', $content, $matches);

Mój przykład pobierze liczbę ze wszystkich atrybutów href, które mają w sobie ciąg ?.target=cośtamcośtamLICZBA&src=. Czy to wystarczy?

P.S. Pisałem z palca, mam nadzieję, że bez błędów smile.gif

Chyba niedziała, bo raczej to nie jest wina tabletu. Na stronie nadal puste tablice.
SmokAnalog
Połknąłem jeden znak. Teraz już przetestowane;
  1. preg_match_all('#href="[^"]*\?\.target=[^0-9"]*(\d+)&\.src=[^"]*"#', $content, $matches);
patrysiek2
Cytat(SmokAnalog @ 20.10.2013, 16:29:03 ) *
Połknąłem jeden znak. Teraz już przetestowane;
  1. preg_match_all('#href="[^"]*\?\.target=[^0-9"]*(\d+)&\.src=[^"]*"#', $content, $matches);

Niewiem co jest, wiem tylko że niedziała.
SmokAnalog
To coś źle robisz. Podstawiłeś w ogóle odpowiednie nazwy zmiennych?
patrysiek2
Cytat(SmokAnalog @ 20.10.2013, 17:44:12 ) *
To coś źle robisz. Podstawiłeś w ogóle odpowiednie nazwy zmiennych?

Nie mam pojecia co robie zle. Zamiast zmiennej content daje page.
SmokAnalog
  1. $page = '<a href="http://edit.yahoo.com/config/send_webmesg?.target=dsgbw71&.src=pg" onclick="popup(this.href, 780, 550); return false"><img src="./styles/cs/imageset/icon_contact_yahoo.gif" width="33" height="13" alt="YIM" title="YIM"></a>';
  2. preg_match_all('#href="[^"]*\?\.target=[^0-9"]*(\d+)&\.src=[^"]*"#', $page, $matches);
  3. var_dump($matches);

Wynik:
Kod
array (size=2)
  0 =>
    array (size=1)
      0 => string 'href="http://edit.yahoo.com/config/send_webmesg?.target=dsgbw71&.src=pg"' (length=72)
  1 =>
    array (size=1)
      0 => string '71' (length=2)

upewnij się czy masz w źródle &src czy &amp;src. Jeśli to drugie, to zamień & w moim wzorcu na &amp;.
patrysiek2
Dobra rozwiązany problem.
Kod SmokaAnaloga pomógł.
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.