[PHP] Wyrażenia regularne

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
krzychu1990
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 21 sty 2008, 23:09
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

[PHP] Wyrażenia regularne

Post 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ę :|.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [PHP] Wyrażenia regularne

Post 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");
?>
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
dam
Sędziwy Jeż
Sędziwy Jeż
Posty: 40
Rejestracja: 21 maja 2008, 20:43
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [PHP] Wyrażenia regularne

Post 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.
rack

Odp: [PHP] Wyrażenia regularne

Post 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
krzychu1990
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 21 sty 2008, 23:09
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Odp: [PHP] Wyrażenia regularne

Post 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; ).
rack

Odp: [PHP] Wyrażenia regularne

Post 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
krzychu1990
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 21 sty 2008, 23:09
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Odp: [PHP] Wyrażenia regularne

Post 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
Kokosek
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 108
Rejestracja: 04 mar 2009, 20:44
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [PHP] Wyrażenia regularne

Post 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
Adam600
Piegowaty Guziec
Piegowaty Guziec
Posty: 4
Rejestracja: 10 sie 2010, 18:01
Płeć: Mężczyzna
Wersja Ubuntu: 6.10
Środowisko graficzne: Inne
Architektura: x86_64

Odp: [PHP] Wyrażenia regularne

Post 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]){
  
}
Kokosek
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 108
Rejestracja: 04 mar 2009, 20:44
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [PHP] Wyrażenia regularne

Post autor: Kokosek »

W jednym miejscu piszesz $lvl a w innym $level, poza tym nigdzie nawet nie próbujesz wyświetlić tej wartości ;)
Kokos - po prostu, nie zdrabniaj ;)
Adam600
Piegowaty Guziec
Piegowaty Guziec
Posty: 4
Rejestracja: 10 sie 2010, 18:01
Płeć: Mężczyzna
Wersja Ubuntu: 6.10
Środowisko graficzne: Inne
Architektura: x86_64

Odp: [PHP] Wyrażenia regularne

Post 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.
dam
Sędziwy Jeż
Sędziwy Jeż
Posty: 40
Rejestracja: 21 maja 2008, 20:43
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [PHP] Wyrażenia regularne

Post 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;

?>
Adam600
Piegowaty Guziec
Piegowaty Guziec
Posty: 4
Rejestracja: 10 sie 2010, 18:01
Płeć: Mężczyzna
Wersja Ubuntu: 6.10
Środowisko graficzne: Inne
Architektura: x86_64

Odp: [PHP] Wyrażenia regularne

Post 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 ?
dam
Sędziwy Jeż
Sędziwy Jeż
Posty: 40
Rejestracja: 21 maja 2008, 20:43
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [PHP] Wyrażenia regularne

Post 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

?>
Adam600
Piegowaty Guziec
Piegowaty Guziec
Posty: 4
Rejestracja: 10 sie 2010, 18:01
Płeć: Mężczyzna
Wersja Ubuntu: 6.10
Środowisko graficzne: Inne
Architektura: x86_64

Odp: [PHP] Wyrażenia regularne

Post autor: Adam600 »

Okej dziala, dziekuje bardzo.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 30 gości