Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]preg_match+problem
Forum PHP.pl > Forum > Przedszkole
Dizzy
  1. <?
  2. $world= 'Harmonia';
  3. $town= 'Venore';
  4. $nic = "";
  5. $houses = 'houses';
  6. $domek = 'Salvation&nbsp;Street&nbsp;2';
  7.  
  8. $ch = curl_init("http://www.tibia.com/community/?subtopic=houses");
  9. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
  10. curl_setopt($ch, CURLOPT_POST, 1);
  11. curl_setopt($ch, CURLOPT_POSTFIELDS, "world=".$world."&state=".$nic."&order=".$nic."&&type=".$houses."&town=".$town);
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  13. echo curl_exec($ch);
  14. $strona = curl_exec($ch);
  15. preg_match_all('/'.$domek.'</nobr></td>(.*?)<input name="houseid" value="([0-9]+)"/', $strona, $id, PREG_SET_ORDER);
  16.  
  17. print_r($id);
  18. ?>

błąd: Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'n' in /house.php on line 15
ma pobrac houseid nastepnie ponownie cURL'em przejsc na kolejną strone i pobrac link obrazka domku.
Proszę o pomoc.
SmokAnalog
Zamień znaki otaczające wzorzec np. na kratki:
  1. preg_match_all('#'.$domek.'</nobr></td>(.*?)<input name="houseid" value="([0-9]+)"#', $strona, $id, PREG_SET_ORDER);
Dizzy
błędu nie ma, ale nic nie zwraca :< Jakis pomysł?
SmokAnalog
Nie wiem co jest w źródle, ale może między ta komórką a polem tekstowym są znaki nowej linii? Jeśli tak, musisz dodać flagę s:
  1. preg_match_all('#'.$domek.'</nobr></td>(.*?)<input name="houseid" value="([0-9]+)"#s', $strona, $id, PREG_SET_ORDER);
Dizzy
  1. <nobr>Salvation&nbsp;Street&nbsp;2</nobr></td><td width="10%"><nobr>82&nbsp;sqm</nobr></td><td width="10%"><nobr>3790&nbsp;gold</nobr></td><td width="40%"><nobr>rented</nobr></td><td><table border="0" cellpadding="0" cellspacing="0"><form action="http://www.tibia.com/community/?subtopic=houses&amp;page=view" method="post"></form><tbody><tr><td>
  2. <input name="world" value="Harmonia" type="hidden">
  3. <input name="town" value="Venore" type="hidden">
  4. <input name="state" value="" type="hidden">
  5. <input name="type" value="houses" type="hidden">
  6. <input name="order" value="" type="hidden">
  7. <input name="houseid" value="35048" type="hidden">
  8. <input name="View" alt="View" src="http://static.tibia.com/images/global/buttons/sbutton_view.gif" border="0" height="18" type="image" width="120">


tak to dokładnie wygląda, to co podales nadal nic nie zmienia tongue.gif dzięki za zaangażowanie.
SmokAnalog
Kolego, zrobiłem test:
  1. $strona = '<nobr>Salvation&nbsp;Street&nbsp;2</nobr></td><td width="10%"><nobr>82&nbsp;sqm</nobr></td><td width="10%"><nobr>3790&nbsp;gold</nobr></td><td width="40%"><nobr>rented</nobr></td><td><table border="0" cellpadding="0" cellspacing="0"><form action="http://www.tibia.com/community/?subtopic=houses&amp;page=view" method="post"></form><tbody><tr><td>
  2. <input name="world" value="Harmonia" type="hidden">
  3. <input name="town" value="Venore" type="hidden">
  4. <input name="state" value="" type="hidden">
  5. <input name="type" value="houses" type="hidden">
  6. <input name="order" value="" type="hidden">
  7. <input name="houseid" value="35048" type="hidden">
  8. <input name="View" alt="View" src="http://static.tibia.com/images/global/buttons/sbutton_view.gif" border="0" height="18" type="image" width="120">';
  9.  
  10. $domek = 'Salvation&nbsp;Street&nbsp;2';
  11.  
  12. preg_match_all('#'.$domek.'</nobr></td>(.*?)<input name="houseid" value="([0-9]+)"#s', $strona, $id, PREG_SET_ORDER);
  13.  
  14. var_dump($id);

Wynik:
Kod
array (size=1)
  0 =>
    array (size=3)
      0 => string 'Salvation&nbsp;Street&nbsp;2</nobr></td><td width="10%"><nobr>82&nbsp;sqm</nobr></td><td width="10%"><nobr>3790&nbsp;gold</nobr></td><td width="40%"><nobr>rented</nobr></td><td><table border="0" cellpadding="0" cellspacing="0"><form action="http://www.tibia.com/community/?subtopic=houses&amp;page=view" method="post"></form><tbody><tr><td>
<input name="world" value="Harmonia" type="hidden">
<input name="town" value="Venore" type="hidden">
<input name="state" value="" type="hidden">
<input name="type" value="houses" type="hidden">
<input name="order" value="" type="hidden">
<input name="houseid" value="35048"' (length=614)
      1 => string '<td width="10%"><nobr>82&nbsp;sqm</nobr></td><td width="10%"><nobr>3790&nbsp;gold</nobr></td><td width="40%"><nobr>rented</nobr></td><td><table border="0" cellpadding="0" cellspacing="0"><form action="http://www.tibia.com/community/?subtopic=houses&amp;page=view" method="post"></form><tbody><tr><td>
<input name="world" value="Harmonia" type="hidden">
<input name="town" value="Venore" type="hidden">
<input name="state" value="" type="hidden">
<input name="type" value="houses" type="hidden">
<input name="order" value="" type="hidden">
' (length=539)
      2 => string '35048' (length=5)

Czyli działa.
Dizzy
to może coś z cURL'em? masz może jakis pomysł? tongue.gif
SmokAnalog
Chyba wiem o co chodzi. Kodowanie tej stronki Tibii to ISO-8859-1, a Ty pewnie używasz u siebie UTF-8 (i dobrze robisz). Spróbuj:
  1. $strona = utf8_encode(curl_exec($ch));
Dizzy
niestety nie pomogło ;-/
SmokAnalog
Jako że lubię zabawę z wyrażeniami regularnymi, pobawiłem się trochę sam - poczytaj moje komentarze. Przykład przetestowany, działa.
  1. <?php
  2. $world= 'Harmonia';
  3. $town= 'Venore';
  4. $nic = "";
  5. $houses = 'houses';
  6. $domek = 'Salvation&[usuń to]#160;Street&[usuń to]#160;2'; // zauważ, że zmieniłem &nbsp; na &[usuń to]#160; - tak było w źródle
  7.  
  8. $ch = curl_init("http://www.tibia.com/community/?subtopic=houses");
  9. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
  10. curl_setopt($ch, CURLOPT_POST, 1);
  11. curl_setopt($ch, CURLOPT_POSTFIELDS, "world=".$world."&state=".$nic."&order=".$nic."&&type=".$houses."&town=".$town);
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  13. $strona = curl_exec($ch); // najpierw zapisz do zmiennej, potem wypluwaj, żeby dwa razy nie robić curl_exec
  14. echo $strona; // po co wypluwasz źródło?
  15. // Twój kod nie oddawał struktury HTML ze źródła - tu nie ma cudzysłowów, a tagi są zapisane wielkimi literami;
  16. // Oprócz tego zmieniłem nazwę zmiennej $id na $matches, bo ona przechowuje też całe dopasowania
  17. // Znowu zmieniłem znaki graniczne wzorca, tym razem na {...}, bo w $domek występują kratki
  18. // Usunąłem nawias z (.*?) - domyślam się, że nie interesuje Cię ta zawartość, więc nie ma sensu jej przechwytywać i zaśmiecać zmiennej z dopasowaniami
  19. preg_match_all('{'.$domek.'</NOBR></TD>.*?<INPUT TYPE=hidden NAME=houseid VALUE=([0-9]+)}s', $strona, $matches, PREG_SET_ORDER);
  20. print_r($matches);


EDIT

Forum pozamieniało mi zakodowaną spację na zwykłą, więc oczywiście pozbądź się bloków [usuń to] smile.gif
_Borys_
\/, \" itd
Błąd spowodowany brakiem backslashy w wyrażeniu regularnym.
SmokAnalog
Co? Nie musisz przecież backslashować tych znaków.
_Borys_
Cytat(SmokAnalog @ 27.10.2013, 11:52:08 ) *
Co? Nie musisz przecież backslashować tych znaków.

U niego nie działa bez backslashy, niedawno zakładał temat z podobnym błędem.
EDIT
Soryy to ktoś inny zakładał temat, ale problem podobny.
Dizzy
Działa, nie wiem jak Ci dziękować smile.gif Teraz jeszcze uporanie się z cURL żeby wszedł w dany domek tongue.gif Hmm jakies propozycje? biggrin.gif
SmokAnalog
Cytat(Dizzy @ 27.10.2013, 11:05:23 ) *
Działa, nie wiem jak Ci dziękować smile.gif Teraz jeszcze uporanie się z cURL żeby wszedł w dany domek tongue.gif Hmm jakies propozycje? biggrin.gif

To zależy co chcesz z tym robić. Możliwości jest kilka - przekazywać domek w $_GET, albo może jakieś GUI do tego.
Dizzy
SmokAnalog, posiadasz może gg?
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.