Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Frage zum Tut: [PHP] Fremde Webseiten auslesen
Antwort
 
Themen-Optionen
Alt 07.02.2007, 19:41   Nach oben    #1
the_cRu
-Antichrist.Superstar-
 
Benutzerbild von the_cRu
 
Registriert seit: 07.02.2007
Ort: .sH!
Beiträge: 29
Standard Frage zum Tut: [PHP] Fremde Webseiten auslesen

nabend,

ich hätte da mal eine frage zu dem tutorial:

[php] Fremde Webseiten auslesen

soweit ist es ja recht klar und verständlich,
nur habe ich probleme damit, einige seiten auszulesen.

wenn ich z.b. eine tabelle habe, die so aussieht:
Code:
<table class="table" width="420" border="0" cellspacing="1" cellpadding="3">
  <tr>
    <td colspan="3"><b>Mitglieder</b></td>
  </tr>
  <tr>
    <td width="50%"><b>Spieler</b></td>
    <td width="20%"><b>Punkte</b></td>
    <td width="30%"><b>Status</b></td>
  </tr>
  <tr>
    <td><a href="#">Nick1</a></td>
    <td>74</td>
    <td>Mitglied</td>
  <tr>
    <td><a href="#">Mitglied5</a></td>
    <td>85</td>
    <td>Mitglied</td>
  <tr>
    <td><a href="#">User80</a></td>
    <td>745</td>
    <td>Mitglied</td>
</table>
wie lese ich da denn NUR die mitgliedsnamen und die jeweiligen punkte aus?
also das er mir das z.b. so ausgibt:

Nick1, 74
Mitglied5, 85
User80, 754

irgendwie hab ich schon gegoogelt, mir x funktionen angeguckt, aber nie habe ich es geschafft...

vllt. könnt ihr mir ja weiterhelfen.

LG

Geändert von Jann Hendrik (28.05.2008 um 20:00 Uhr). Grund: link aktualisiert
the_cRu ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.02.2007, 20:04   Nach oben    #2
Jojo
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
Standard

Also wenn du weißt, dass die Tabelle so aussieht, kannst du das ganze durch einen preg_match_all() laufen lassen.

Dazu müsstest du dich aber ein wenig mit Regulären Ausdrücken auskennen.
Der würde dann ein wenig so aussehen:
Code:
<tr>\s*<td><a href="#">(.+)<\/a><\/td>\s*<td>(\d+)<\/td>\s*<td>Mitglied<\/td>
dann bekommst du bei deiner Tabelle folgende Struktur, wenn du das mit preg_match_all() und dem Modifier U bearbeitest:
Code:
Array
(
    [0] => Array
        (
            [0] => <tr>
    <td><a href="#">Nick1</a></td>
    <td>74</td>
    <td>Mitglied</td>
            [1] => <tr>
    <td><a href="#">Mitglied5</a></td>
    <td>85</td>
    <td>Mitglied</td>
            [2] => <tr>
    <td><a href="#">User80</a></td>
    <td>745</td>
    <td>Mitglied</td>
        )

    [1] => Array
        (
            [0] => Nick1
            [1] => Mitglied5
            [2] => User80
        )

    [2] => Array
        (
            [0] => 74
            [1] => 85
            [2] => 745
        )

)
Damti kannst du arbeiten.
Hoffe ich konnte helfen,

Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.02.2007, 20:54   Nach oben    #3
the_cRu
-Antichrist.Superstar-
 
Benutzerbild von the_cRu
 
Registriert seit: 07.02.2007
Ort: .sH!
Beiträge: 29
Standard

danke für deine antwort...
habe mal einfach deinen ausdruck übernommen,
da ich die regulären ausdrücke noch nicht ganz verstehe (#zum teil schon, aber net ganz).

nun bekomme ich den fehler:

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier '\' in C:\xampp_apache\xampp\htdocs\test\getit.php on line 24

mein code sieht jetzt so aus:

PHP-Code:
<?php
$host 
"http://213.203.201.100/de/9/index.php?s=rqsohkcyp3vf&p=alliance&sub=members";
$filestring file_get_contents($host);
$startpos 0;
while(
$pos strpos($filestring'<table class="table" width="420" border="0" cellspacing="1" cellpadding="3">'$startpos))
{
    
$string substr($filestring$posstrpos($filestring'</table><div style='$pos 1) - $pos);

    if(
stristr($string'p=member')) {

    
// echo "" . strip_tags($string) . "<br />";
     
    
preg_match_all('<tr>\s*<td><a href="#">(.+)<\/a><\/td>\s*<td>(\d+)<\/td>\s*<td>Mitglied<\/td>'$string$content);
    
    }
    
    
$startpos $pos 1;
    
}
?>
ich hoffe ich habe jetzt nichts übersehen...
the_cRu ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.02.2007, 20:58   Nach oben    #4
Chr!s
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Die fehlt ein Modifier bzw die Begrenzungezeichen (weiß gerade nicht, wie die heißen). D.h. du darfst PHP nicht
Code:
<tr>\s*<td><a href="#">(.+)<\/a><\/td>\s*<td>(\d+)<\/td>\s*<td>Mitglied<\/td>
Geben, sondern z.B. das:
Code:
#<tr>\s*<td><a href="\#">(.+)<\/a><\/td>\s*<td>(\d+)<\/td>\s*<td>Mitglied<\/td>#
Dadurch, dass du dann # als Zeichen verwendest, musst du alle anderen # in deinem Regex escapen (also \# schreiben). Du kannst aber theretisch jedes Beliebige Zeichen als Begrenzung verwenden.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.02.2007, 21:05   Nach oben    #5
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Hier mal ein Link zu regulären Ausdrücken. Da schau ich öfters mal rein.
http://www.regenechsen.de/phpwcms/index.php?regex_allg
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.02.2007, 23:52   Nach oben    #6
the_cRu
-Antichrist.Superstar-
 
Benutzerbild von the_cRu
 
Registriert seit: 07.02.2007
Ort: .sH!
Beiträge: 29
Standard

danke für eure antworten.
habe mir die regulären ausdrücke nochmal genauer angeschaut,
und habe nun auch die logik eigentlich ganz gut verstanden.

zumindest weiß ich was:

Code:
#<tr>\s*<td><a href="\#">(.+)<\/a><\/td>\s*<td>(\d+)<\/td>#
bedeutet. der eine teil mit dem "mitglied" ist unwichtig gewesen... den hab ich erstmal rausgenommen.

habe das ganze nun so umgebaut, also so wie ich es zumindest verstanden habe:

PHP-Code:
    preg_match_all('#<tr>\s * <td><a href="\#">(.+)<\/a><\/td>\s * <td>(\d+)<\/td>#'$string$content);

// $string ist der inhalt der ausgelesen wird, und $content das spätere array, bzw. aktuelle array

// meine ausgabe läuft über:

    
echo $content[1][0]; 
problem hier: er zeigt nichts an... entweder hab ich nen denkfehler drinne, irgendwas falsch gemacht oder es ist einfach zu spät für mich *fg

der gesamte code sieht so aus:

PHP-Code:
<?php
$host 
"http://www.testdomain.de/index.php?action=ausgabe";
$filestring file_get_contents($host);
$startpos 0;
while(
$pos strpos($filestring'<table class="table" width="420" border="0" cellspacing="1" cellpadding="3">'$startpos))
{
    
$string substr($filestring$posstrpos($filestring'</table><div style='$pos 1) - $pos);

    
// echo "" . strip_tags($string) . "<br />";
     
    
preg_match_all('#<tr>\s * <td><a href="\#">(.+)<\/a><\/td>\s * <td>(\d+)<\/td>#'$string$content);
    
    echo 
$content[1][0];
    
    
$startpos $pos 1;
    
}
?>
LG
the_cRu ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2007, 00:15   Nach oben    #7
Jojo
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
Standard

Dir fehlt der Modifier U, der die Gier unterdrückt, sonst versucht er einen Quantifier immer auf das Maximale auszureizen, was aber darin endet, dass der Rest des Ausdrucks nicht mehr passt.

Schreib nach dem hinteren # ein U, dann sollte es gehen.

Grüße,
Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2007, 06:07   Nach oben    #8
the_cRu
-Antichrist.Superstar-
 
Benutzerbild von the_cRu
 
Registriert seit: 07.02.2007
Ort: .sH!
Beiträge: 29
Standard

Zitat:
Zitat von Jojo Beitrag anzeigen
Dir fehlt der Modifier U, der die Gier unterdrückt, sonst versucht er einen Quantifier immer auf das Maximale auszureizen, was aber darin endet, dass der Rest des Ausdrucks nicht mehr passt.

Schreib nach dem hinteren # ein U, dann sollte es gehen.

Grüße,
Jojo
args...
nuja, habs mal angehangen und das auch nochmal gelesen,
was das U genau vorhat, bzw. wofür es gut ist.
es klappt aber dennoch nicht...
the_cRu ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2007, 07:39   Nach oben    #10
Jann Hendrik
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.207
Standard

ich bin da ja auch nicht der Brüller in der Thematik, aber folgendes funktioniert bei mir einwandfrei:
http://regex-tester.de/regex4_20070208073428.html


RegEx:
Code:
<tr>\s*<td><a href="\#">(.+)<\/a><\/td>\s*<td>(\d+)<\/td>\s*<td>Mitglied<\/td>
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!

Geändert von Ben (08.02.2007 um 07:43 Uhr).
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2007, 09:27   Nach oben    #11
dsxs
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard

Die regex stimmt prinzipiell schon so - den U flag brauchst du in diesem Fall auch nicht zwingend zu setzten, da die Suche durch <\/td> bereits korrekt abgegrenzt wird.

Versuche aber mal folgende Regex am Quelltext der Seite aus:

PHP-Code:
preg_match_all('#&lt;tr&gt;\s * &lt;td&gt;&lt;a href=&quot;\#&quot;&gt;(.+)&lt;\/a&gt;&lt;\/td&gt;\s * &lt;td&gt;(\d+)&lt;\/td&gt;#'$string$content); 

Gruss
__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse

dsxs ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2007, 11:45   Nach oben    #12
Jojo
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
Standard

Zitat:
Zitat von dsxs Beitrag anzeigen
Die regex stimmt prinzipiell schon so - den U flag brauchst du in diesem Fall auch nicht zwingend zu setzten, da die Suche durch <\/td> bereits korrekt abgegrenzt wird.
Also ich habs im Regextester ohne U nich hinbekommen!
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2007, 15:10   Nach oben    #13
the_cRu
-Antichrist.Superstar-
 
Benutzerbild von the_cRu
 
Registriert seit: 07.02.2007
Ort: .sH!
Beiträge: 29
Standard

danke für eure zahlreichen antworten,
doch langsam habe ich das gefühl das irgendein server net mitspielt.

wenn ich mit echo die gesamte liste ausgebe funzt es.
mit preg_match_all irgendwie net mehr.
egal welche ausdrücke ich nehme... er zeigt einfach nichts an.

kann es vllt. denn an der seite liegen,
dass der das unterbindet?

mit dem code bekomme ich nur:

PHP-Code:
<?php
$host 
"http://*****/de/9/index.php?s=wkbxoxm2kq1j&p=alliance&sub=members";
$filestring file_get_contents($host);
$startpos 0;
while(
$pos strpos($filestring'<table class="table" width="420" border="0" cellspacing="1" cellpadding="3">'$startpos))
{
    
$string substr($filestring$posstrpos($filestring'</table><div style='$pos 1) - $pos);

    echo 
$string "<br />";
     
    
$rausdruecke '/<tr>\s*<td><a href="\#">(.+)<\/a><\/td>\s*<td>(\d+)<\/td>\s*<td>Mitglied<\/td>/U'
    
preg_match_all($rausdruecke$string$content); 
    
    echo 
'<pre>'print_r($contenttrue), '</pre>';
    
    
$startpos $pos 1;
    
}
?>
Zitat:
Array
(
[0] => Array
(
)

[1] => Array
(
)

[2] => Array
(
)

)
und halt die liste der leute, da diese ja mit echo ausgegeben werden...

Geändert von Ben (08.02.2007 um 16:01 Uhr). Grund: Adresse zensiert
the_cRu ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2007, 15:23   Nach oben    #14
Jojo
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
Standard

also wenn du den Content einer Seite in ne Variable speichern kannst, dann hat das in dem Moment nix mehr mit dem fremden Server zu tun.
Dann ist das schlichtweg ein String in deinem Programm.

Versuch doch erstmal, einen Code mit einem vorgegebenen String zu erstellen, der funktioniert.
Wenn das geht, dann weißt du, dass es theoretisch funzt.
Dann kannst du dir den String von nem anderen Server holen.
Und gib den String mal mit var_dump() aus, vielleicht ist das Empfangene einfach irgendwie komisch formatiert, sodass der Regex nicht anspringt....
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2007, 15:40   Nach oben    #15
Jann Hendrik
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.207
Standard

ist in $filestring auch was drin?

Bist du sicher, dass er die Daten auch vom anderen Server ausgelesen hat?
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten