Strona 1 z 1

[PHP] Wyrażenia regularne

: 30 gru 2009, 20:29
autor: krzychu1990
No więc tak jako, że poruszałem ten temat na forum.php.pl ale nie dostałem odpowiedzi to postanowiłem napisać to na tym forum :).
Tworzę serwis o śmiesznej grze - Tibia, ale, że to jest jedyna gra w jaką czasami pogrywam to padło właśnie na nią. Więc na początek chce zrobić takią podstronę, skrpt, który po wpisaniu swojego nicku będzie pobierał ze strony tibia.com informacje na temat postaci o tym nicku i wyświetlał je u mnie na stronie.
<?php
$postac = $_POST['postac'];
$zapisz = system(" curl -d 'name=$postac' http://www.tibia.com/community/?subtopic=characters");
...
?>
Oczywiście jest to połączone z formularzem html'a. Jedyny problem jest taki, że pobiera on mi cały layout strony, i podpina go pod ten plik, w którym mam powyższy skrypt PHP. Teraz utknąłem bo nie wiem jak rozwiązać pewną rzecz, a mianowicie:
Gdy skrypt już pobierze tą stronę, to następny skrypt ma za zadanie wybrać z tej strony każdą informację o postaci osobno za pomocą wyrażeń regularnych (preg_match itd). No tylko, że każda postać ma inną nazwe, poziom itd. czyli każda postać będzie miała inny html. I teraz nie wiem jak to rozwiązać żeby było najlepiej i najprościej. Niestety chyba w zmiennej nie jestem w stanie zamknąć takiej ilosci html-a... zawsze wyskakuje jakiś błąd parsera... Proszę o pomoc.
Pozdrawiam.
Był to mój post na forum, jeden z użyszkodników poradził mi tak:
Nie lepiej zwykły file_get_contents ?

Dam Ci podpowiedz.
$postac = 'Pikapo Eleandril';
$page = file_get_contents('http://www.tibia.com/community/?subtopi ... ='.$postac);
preg_match("#<TD WIDTH=20%>Name:</TD><TD>([a-zA-Z ']+)</TD>#", $page, $nick);
Stosując się do jego porady mam teraz pytanie do was:

Funkcja, którą podał mi powyższy użytkownik zwraca Array () no czyli nic, bo w subject nie ma nicku postaci, a jak wiadomo każda postać ma inny nick czyli należałoby zamknąć ten kod html w jakiejś zmiennej albo coś... nie wiem właśnie jak zrobić, żeby subject sam sie dobierał w zależności od kodu html każdego z osobna gracza...
Oczywiście mój problem może być banalny, i za to przepraszam ale ja sobie z tym poradzic nie mogę :|.

Odp: [PHP] Wyrażenia regularne

: 30 gru 2009, 21:06
autor: beluosus
Po pierwsze Array to nie jest 'no czyli nic' tylko tablica. Kod, który podałeś jest poprawny i wypisuje nick postaci ( echo $nick[1]; ). Powinieneś to wywnioskować z odpowiedzi do Twojego poprzedniego tematu. Pewnie nie wiesz ale w POSTach i GETach spacje są zamieniane na + (znak plus) więc poniższy kod powinien rozwiązać problem.

Kod: Zaznacz cały

<?php
    $postac = 'Pikapo Eleandril';
    $postac = str_replace(' ', '+', $postac);
    $page = file_get_contents('http://www.tibia.com/community/?subtopic=characters&name=' . $postac);

    preg_match('/Name:<\/tD><TD>(.+)<\/TD>/Ui', $page, $wynik);

    if ($wynik)
        echo("Name: " . $wynik[1]);

    echo("\n");
?>

Odp: [PHP] Wyrażenia regularne

: 30 gru 2009, 21:14
autor: dam
krzychu1990 pisze:...
Funkcja, którą podał mi powyższy użytkownik zwraca Array () no czyli nic, bo w subject nie ma nicku postaci, a jak wiadomo każda postać ma inny nick czyli należałoby zamknąć ten kod html w jakiejś zmiennej albo coś... nie wiem właśnie jak zrobić, żeby subject sam sie dobierał w zależności od kodu html każdego z osobna gracza...
Oczywiście mój problem może być banalny, i za to przepraszam ale ja sobie z tym poradzic nie mogę :|.
Podany kod powinien działać, najpierw sprawdź czy serwer, na którym wykonywany jest skrypt dopuszcza otwieranie zewnętrznych adresów, a dokładniej czy dyrektywa allow_url_fopen jest ustawiona na On lub 1, najprościej sprawdzisz to uruchamiając w przeglądarce taki sktypt

Kod: Zaznacz cały

<?php phpinfo() ?>
jako wynik jego działania zobaczysz konfiguracje swojego serwera, szukaj tam linijki zawierającej frazę allow_url_fopen i zobacz jaką ma wartość, jeśli Off lub 0 to file_get_contents w tym przypadku ci nie zadziała.

Odp: [PHP] Wyrażenia regularne

: 30 gru 2009, 21:29
autor: rack
Bez zaocznego szukania możesz to znaleźć jak leci:

Kod: Zaznacz cały

  php -r "phpinfo(4);" | grep 'allow_url_fopen'
o ile oczywiście masz dostęp do php z linii polecen ;))

I jeszcze jedna dobra rada:

Zainstaluj sobie xdebug. Będziesz miał bardzo ładnie rozpisane zmienne, obiekty i tablice ...

Kod: Zaznacz cały

sudo aptitude install php5-xdebug
S.Wojnowski

Odp: [PHP] Wyrażenia regularne

: 30 gru 2009, 23:03
autor: krzychu1990
Więc tak mam 2 problemy, jeden jest dość dziwny: ) Mianowicie udało mi się pobrać prawie wszystkie potrzebne informacje. Jednak level postaci raz się wyciąga a raz nie...

Kod: Zaznacz cały

//LEVEL
$postac = $_POST['postac'];
$postac = str_replace(' ', '+', $postac); 
$page = file_get_contents('http://www.tibia.com/community/?subtopic=characters&name='.$postac);
preg_match("#><TD>Level:</TD><TD>([1-500']+)</TD></TR><TR#", $page, $lvl);
print_r($lvl[1]);
I naprzykład w przypadku nicku: Vizu Deathbringer skrypt (wraz z resztą wywala):
level:55 name:Vizu Deathbringer vocation:Knight sex:male residence:Carlin world: Vinera (W htmlu wyglada to tak <TD>Level:</TD><TD>55</TD></TR>)
A w przypadku nicku Fresh Master
level: name:Fresh Master vocation: Master Sorcerer sex:male residence:Yalahar world: Refugia (HTML <TD>Level:</TD><TD>137</TD></TR>)
Oczywiście ten html dodałem ręcznie, do porównania... Wygląda tak samo. Więc nie mam pojęcia co może być przyczyną.

Druga Kwestia:
Z tego ciągu chcę wyciągnąć Premium Account:

Kod: Zaznacz cały

 <TD>Account*...Status:</TD><TD>Premium Account</TD></TR> 

Niestety gdy do preg_match wkleję

Kod: Zaznacz cały

<TD>Account*...Status:</TD><TD([a-zA-Z1-500 ']+)</TD> 

To parser mówi, że 1 to nie poprawny definier. Pluje się pewnie o to *... Próbowałem w zmiennej $page zmienic wszystkie *... na spacje albo '+' poprzez str_replace ale niestety nie udało się.

YY gwiazdka i trzy kropki zastępuje kombinację (amp,kratka,160; ).

Odp: [PHP] Wyrażenia regularne

: 31 gru 2009, 16:42
autor: rack
Spróbuj tego:

poziom doświadczenia

Kod: Zaznacz cały

$your_hero = urlencode("Vizu Deathbringer");
$raw = file_get_contents('http://www.tibia.com/community/?subtopic=characters&name='.$your_hero);
preg_match("#<TD>Level:</TD><TD>(\d{1,3})</TD>#",$raw,$lvl);
if($level[1]){
  // dalsza częśc skryptu
}
-----------------------------

typ konta

Kod: Zaznacz cały

preg_match("#<TD>Account&\#160;Status:</TD><TD>(Free|Premium)#",$raw,$account);
if(account[1]){
  // dalszy ciąg skryptu
}
enjoy ;))

S.Wojnowski

Odp: [PHP] Wyrażenia regularne

: 01 sty 2010, 22:06
autor: krzychu1990
Dziękuje ruby :). Działa. Następny problem... oczywiście Ci z forum.php.pl sie obijają.

Witam potrzebuję z tego ciągu


Kod: Zaznacz cały

 <TD>Guild membership:</TD><TD>Sombra of the <A HREF="http://www.tibia.com/community/?subtopic=guilds&page=view&GuildName=Sinners">Sinners</A></TD>



wyciągnąć

Kod: Zaznacz cały

Sombra of the <A HREF="http://www.tibia.com/community/?subtopic=guilds&page=view&GuildName=Sinners">Sinners</A>

(Ma wyświetlać Sombra of the Sinners (sinners podświetlono na niebiesko jako hiperłącze).

Kombinuje już dłuższy czas, ale nie mogę sobie z tym poradzić :///.

Pozdrawiam

Odp: [PHP] Wyrażenia regularne

: 04 sty 2010, 23:09
autor: Kokosek

Kod: Zaznacz cały

<TD>Guild membership:</TD><TD>TEKST</TD>
Rozumiem, że chcesz wyciągnąć TEKST. W tym wypadku przyda się leniwe dopasowywanie wyrażeń. Myślę, że znajdziesz co trzeba ;) W razie czego pisz

Odp: [PHP] Wyrażenia regularne

: 10 sie 2010, 18:04
autor: Adam600
Mam problem, mianowicie nie wyświetla mi się level pożądanej postaci. Nie bardzo rozumiem php, jeśli ktoś byłby łaskaw wyedytować mi moje wypociny, byłbym niezmiernie wdzięczny.

P.S. Probowałem stosowac wasze pomoce powyżej, lecz mam zablokowane file_get_contects
"Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /html/adam/lol.php on line 4"

Kod: Zaznacz cały

<?php
function file_get_contents_curl($url) {
$ch = curl_init();
$timeout = 30; 
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);
$file_contents = curl_exec($ch);
curl_close($ch);
return $file_contents;
}

$your_hero = urlencode("Marku");
$url= 'http://www.tibia.com/community/?subtopic=characters&name='.$your_hero;
preg_match("#<TD>Level:</TD><TD>(\d{1,3})</TD>#",$url,$lvl);
if($level[1]){
  
}

Odp: [PHP] Wyrażenia regularne

: 10 sie 2010, 23:30
autor: Kokosek
W jednym miejscu piszesz $lvl a w innym $level, poza tym nigdzie nawet nie próbujesz wyświetlić tej wartości ;)

Odp: [PHP] Wyrażenia regularne

: 10 sie 2010, 23:41
autor: Adam600
Kokosek pisze:W jednym miejscu piszesz $lvl a w innym $level, poza tym nigdzie nawet nie próbujesz wyświetlić tej wartości ;)
Mogłbym prosić Cię o pomoc w edytowaniu tych błędów oraz braków, które zauważyłeś?

Z góry dziekuje.

Odp: [PHP] Wyrażenia regularne

: 14 sie 2010, 17:40
autor: dam
P.S. Probowałem stosowac wasze pomoce powyżej, lecz mam zablokowane file_get_contects
A curl'a masz?

Jak masz:

Kod: Zaznacz cały

<?php
function file_get_contents_curl($url) {
$ch = curl_init();
$timeout = 30; 
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);
$file_contents = curl_exec($ch);
curl_close($ch);
return $file_contents;
}

$your_hero = urlencode('Marku');
$url= 'http://www.tibia.com/community/?subtopic=characters&name='.$your_hero;
preg_match('/<td>Level:<\/td><td>(\d{1,3})<\/td>/i', file_get_contents_curl($url), $lvl);

$level = $lvl[1];

echo $level;

?>

Odp: [PHP] Wyrażenia regularne

: 14 sie 2010, 18:37
autor: Adam600
dam pisze:A curl'a masz?

Jak masz:

Kod: Zaznacz cały

<?php
function file_get_contents_curl($url) {
$ch = curl_init();
$timeout = 30; 
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);
$file_contents = curl_exec($ch);
curl_close($ch);
return $file_contents;
}

$your_hero = urlencode('Marku');
$url= 'http://www.tibia.com/community/?subtopic=characters&name='.$your_hero;
preg_match('/<td>Level:<\/td><td>(\d{1,3})<\/td>/i', file_get_contents_curl($url), $lvl);

$level = $lvl[1];

echo $level;

?>
Dziekuje bardzo pod curla dziala, jesli byla by mozliwosc, postawilbym piwo :)!

Nie sprawiloby problemu gdybys napisal jeszcze osobny malutki skrypt na bazie poprzedniego, ktory by okreslal czy dana postac ma Account Status Premium Account, badz Free Account ?

Odp: [PHP] Wyrażenia regularne

: 14 sie 2010, 19:04
autor: dam

Kod: Zaznacz cały

<?php
function file_get_contents_curl($url) {
$ch = curl_init();
$timeout = 30; 
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);
$file_contents = curl_exec($ch);
curl_close($ch);
return $file_contents;
}

$your_hero = urlencode('Marku');

$url= 'http://www.tibia.com/community/?subtopic=characters&name='.$your_hero;
preg_match('/<td>Level:<\/td><td>(\d{1,3})<\/td>.*?<td>Account.+?Status:<\/td><td>(Free|Premium).*?Account<\/td>/si', file_get_contents_curl($url), $info);

$level = $info[1]; // np. 239
$accountStatus = $info[2]; // Free lub Premium

?>

Odp: [PHP] Wyrażenia regularne

: 14 sie 2010, 19:24
autor: Adam600
Okej dziala, dziekuje bardzo.