Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]preg_match+problem
Dizzy
post 27.10.2013, 00:43:48
Post #1





Grupa: Zarejestrowani
Postów: 139
Pomógł: 0
Dołączył: 6.09.2008

Ostrzeżenie: (10%)
X----


  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.
Go to the top of the page
+Quote Post
SmokAnalog
post 27.10.2013, 01:08:56
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post
Dizzy
post 27.10.2013, 01:12:41
Post #3





Grupa: Zarejestrowani
Postów: 139
Pomógł: 0
Dołączył: 6.09.2008

Ostrzeżenie: (10%)
X----


błędu nie ma, ale nic nie zwraca :< Jakis pomysł?
Go to the top of the page
+Quote Post
SmokAnalog
post 27.10.2013, 01:16:33
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post
Dizzy
post 27.10.2013, 01:19:06
Post #5





Grupa: Zarejestrowani
Postów: 139
Pomógł: 0
Dołączył: 6.09.2008

Ostrzeżenie: (10%)
X----


  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.
Go to the top of the page
+Quote Post
SmokAnalog
post 27.10.2013, 01:26:36
Post #6





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Dizzy
post 27.10.2013, 01:29:54
Post #7





Grupa: Zarejestrowani
Postów: 139
Pomógł: 0
Dołączył: 6.09.2008

Ostrzeżenie: (10%)
X----


to może coś z cURL'em? masz może jakis pomysł? tongue.gif
Go to the top of the page
+Quote Post
SmokAnalog
post 27.10.2013, 01:42:19
Post #8





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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));
Go to the top of the page
+Quote Post
Dizzy
post 27.10.2013, 10:01:00
Post #9





Grupa: Zarejestrowani
Postów: 139
Pomógł: 0
Dołączył: 6.09.2008

Ostrzeżenie: (10%)
X----


niestety nie pomogło ;-/
Go to the top of the page
+Quote Post
SmokAnalog
post 27.10.2013, 10:39:40
Post #10





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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

Ten post edytował SmokAnalog 27.10.2013, 10:42:16
Go to the top of the page
+Quote Post
_Borys_
post 27.10.2013, 10:47:38
Post #11





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


\/, \" itd
Błąd spowodowany brakiem backslashy w wyrażeniu regularnym.

Ten post edytował _Borys_ 27.10.2013, 10:48:38
Go to the top of the page
+Quote Post
SmokAnalog
post 27.10.2013, 10:52:08
Post #12





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Co? Nie musisz przecież backslashować tych znaków.
Go to the top of the page
+Quote Post
_Borys_
post 27.10.2013, 11:04:05
Post #13





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


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.

Ten post edytował _Borys_ 27.10.2013, 11:09:55
Go to the top of the page
+Quote Post
Dizzy
post 27.10.2013, 11:05:23
Post #14





Grupa: Zarejestrowani
Postów: 139
Pomógł: 0
Dołączył: 6.09.2008

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
SmokAnalog
post 27.10.2013, 11:09:02
Post #15





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Dizzy
post 27.10.2013, 11:12:29
Post #16





Grupa: Zarejestrowani
Postów: 139
Pomógł: 0
Dołączył: 6.09.2008

Ostrzeżenie: (10%)
X----


SmokAnalog, posiadasz może gg?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:08