s1gh Skrevet 20. desember 2008 Del Skrevet 20. desember 2008 Har nå startet med cURL, og forsåvidt fått hentet ut informasjon fra diverse nettsider. Eller, det vil, jeg har hentet ut HELE nettsida. Men jeg tenkte jeg kunne prøve å printe ut informasjon som står mellom to tags, noe jeg rett og slett ikke klarer. Det blir ikke printet ut noe, med andre et tomt resultat. //cURL code $ch = curl_init("www.example.com/"); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); $strpos = substr($output, "<title>"); $find = strpos($output, $strpos); $strpos1 = strpos($find, "</title>"); $t = substr($find, $strpos, $strpos1); echo "$t"; ?> Som dere sikkert skjønner, prøver jeg å printe ut noe så basic som tittelen på example.com. Men jeg skjønner rett og slett ikke hva jeg gjør feil... Har jeg misforstått strpos og substr-funksjonene? //s1gh Lenke til kommentar
OISNOT Skrevet 20. desember 2008 Del Skrevet 20. desember 2008 (endret) $strpos = substr($output, "<title>"); //returnerer hele $output fordi "<title>" blir til 0 $find = strpos($output, $strpos); //returnerer et tall som sikkert er 0 $strpos1 = strpos($find, "</title>"); //returnerer false $t = substr($find, $strpos, $strpos1); //returnerer en tom streng fordi du spør etter lengde på 0 (false). echo "$t"; //ikke nødvendig med " rundt $t Du ser vel etter noe slikt som $startText = '<title>'; $endText = '</title>'; $startPos = strpos($output, $startText) + strlen($startText); $length = strpos($output, $endText) - $startPos; $t = substr($output, $startPos, $length); echo $t; eller $regex = '#<title>(?P<title>[^<]*)</title>#s'; if (!preg_match($regex, $output, $matches)) { //no matches exit('Site has no title tags!'); } $t = $matches['title']; echo $t; Edit: english overload ... og lengde forklaring. Endret 20. desember 2008 av OISNOT Lenke til kommentar
s1gh Skrevet 20. desember 2008 Forfatter Del Skrevet 20. desember 2008 $startText = '<title>'; $endText = '</title>'; $startPos = strpos($output, $startText) + strlen($startText); $length = strpos($output, $endText) - $startPos; $t = substr($output, $startPos, $length); echo $t; Den koden printet ikke ut tittelen...Den printet ut hele siden - som jeg forsåvidt kunne gjort uten strpos osv. Noen som vet hva som er feil? Lenke til kommentar
pulse Skrevet 20. desember 2008 Del Skrevet 20. desember 2008 La meg google det for deg... Første treff sier at du kan bruke følgende kode: if (preg_match("/<title>(.*)<\\\/title>/", $output, $matches)) { $title=$matches[1]; } prøvd den? Lenke til kommentar
s1gh Skrevet 20. desember 2008 Forfatter Del Skrevet 20. desember 2008 (endret) Har ikke prøvd akkurat den kodesnutten der, men har lest litt om preg_match. Men jeg skjønner ikke hvorfor det ikke vil funke med koden over, altså med strpos og substr. Vil gjerne finne ut hva jeg gjør feil i den koden, før jeg prøver å løse det på en annen måte... Og angående det med tittelen, det var bare et eksempel. Ville hente ut informasjonen mellom <title> og </title> som et forsøk på skjønne hvordan det fungerer. Senere skal jeg selvfølgelig hente ut data mellom andre tags. Edit: prøvde nå kodesnutten med preg_match, men ser ikke ut til at den funker heller, desverre. Endret 20. desember 2008 av Sigh Lenke til kommentar
OISNOT Skrevet 20. desember 2008 Del Skrevet 20. desember 2008 Den koden printet ikke ut tittelen...Den printet ut hele siden - som jeg forsåvidt kunne gjort uten strpos osv. Noen som vet hva som er feil? Min feil, må bruke stripos. $startText = '<title>'; $endText = '</title>'; $startPos = stripos($output, $startText) + strlen($startText); $length = stripos($output, $endText) - $startPos; $t = substr($output, $startPos, $length); echo $t; og med case insensitivity for regex $regex = '#<title>(?P<title>[^<]*)</title>#is'; if (!preg_match($regex, $output, $matches)) { //no matches exit('Site has no title tags!'); } $t = $matches['title']; echo $t; Lenke til kommentar
s1gh Skrevet 20. desember 2008 Forfatter Del Skrevet 20. desember 2008 Se der, ja. Nå fungerer det utmerket. Tusen takk for hjelpen! Lenke til kommentar
Peter Skrevet 21. desember 2008 Del Skrevet 21. desember 2008 Evt. kan du bruke PHPs DOM API: http://no2.php.net/manual/en/class.domdocument.php Etter min mening en litt penere løsning, og ikke så rigid, dog kanskje mer krevende. Lenke til kommentar
s1gh Skrevet 21. desember 2008 Forfatter Del Skrevet 21. desember 2008 Hehe, så litt mer krevende ut, men jeg må vel sjekke ut denne løsningen også Lenke til kommentar
mathias123 Skrevet 24. desember 2008 Del Skrevet 24. desember 2008 Bare vær obs på at alle XML/DOM-funksjonene til PHP kommer til å protestere om siden ikke er valid XML/XHTML. Du må eventuelt kjøre disse gjennom tidy, så kan du kjøre xpath (spørrespråk mot XML) mot dem. Det finnes også en tredjepartsklasse som kan gjøre dette og som aksepterer invalid XML: http://simplehtmldom.sourceforge.net/ Denne er som oftest veldig kjekk, men har noen bugs og snodigheter av og til. Ettersom større og større deler av den HTML som produseres er valid, er det en god ide å lære seg XPATH. Det finnes nå egne XML-databaser som har XPATH som spørrespråk i stedet for SQL, og DB2 v9 støtte for å kjøre XPATH inni SQL-spørringer. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå