Forum > Övriga serverspråk > PHP
Hejsan allihopa!
Jag lovade under gårdagen att jag skulle hjälpa en kompis att bygga en modul till hans websida som skulle skrapa information ifrån http://www.tibia.com/community/?sub...p;world=Refugia , jag vet hur man hämtar in själva sidan men mitt problem kommer när jag skall sedan välja ut specifika värden (namn, level och vocation) och sedan köra in dessa i en databas. Om ni kollar på koden så förstår ni nog ganska omgående. Den är ett rent och skärt helvete men då han länkade till sidor som gjort det så måste det ju onekligen gå att göra.
Har även funderat på att använda HTMLDom(http://simplehtmldom.sourceforge.net/), men då de olika tabellerna inte har några unika classer, idn eller dyl så kan jag tyvärr inte nyttja detta, inte såvitt jag kan se iallafall.¨
Är tacksam för alla idéer och förslag!
Uppdaterat: Har kommit på hur jag kan börja, med att plocka namn via länkar.
Har försökt skapa ett regulärt uttryck, känns dock inte som att jag lyckats då det inte händer något.
Så här ser det ut:
preg_match_all('/\&name=[^">]*">([^<]+)</i', $text, $matches);
$text innehåller websidans innehåll
edit: Notera att jag verkligen är urusell på regexp, och har försökt kopiera och klistra ihop ett uttryck med information från olika sidor -.-'
Uppdatering 2:
provade denna kod:
preg_match_all('/\&name=(.*)?\"/i', $text, $matches);Den returnerar inte namnet, eller inte bara, som det var tänkt. Utan detta: (första två orden med ett + emellan är den info jag vill åt, alltså ett namn)
Ablani+Zupoma" >Ablani Zupoma</a></td><td style="width:10%;" >55</td><td style="width:20%;" >Paladin</td></tr><tr class="Ev
Behöver även få min kod att matcha alla träffar, som det är just nu träffar den max 1 rad och nöjer sig där.
För att förtdliga hela denna posten: Så här ser <a> taggen ut på sidan; <a href="http://www.tibia.com/community/?sub...=Hades+Sorceres" >Hades Sorceres</a> och jag vill alltså plocka namnet Hades+Sorceres i detta fallet.
Provat och testat och haft mig, och kommer verkligen ingen vart alls känns det som.
/subtopic=character&name=.+?>(.+?)</A>/iFunkar icke, får ett felmedellande från php som lyder:
DOM gick inget vidare, då sidan, tibia.com, är ett helvete och dem har miljarder av tabelceller osv.. Blir lättare att, tror jag iallafall, att hitta länken som länkar till deras karaktärs sida (något som finns på alla karaktärer i onlinelistan på tibia.com) och dra namnet från länken då det enda som där skiljer sig är namnet på just karaktären.
Provar lite gran just nu, denna koden borde ju i all rimlighet returnera bara världnamnet (Alltså "Premia") och inget annat.
function checkplayer($name){
$name = str_replace(' ', '+', $name);
$raw = file_get_contents('http://www.tibia.com/community/?sub...acters&name='.$name) or die('Couldn\'t access Tibia.com to retrieve data');
$pattern = '/World:<\/td><td>(.*)?<\/td><\/tr>/';
$charName = preg_match($pattern, $raw, $matches);
return $matches[0];
}Just nu returnerar den dock:
DOM är ju a-element, så det förstå jag inte alls vad problemet skulle vara med att det är "miljader tabeller", det är ju inte det du är intresserad över.
.InnerTableContainer:eq(2) tr:gt(0) a
http://www\.tibia\.com/ community/\?subtopic=chara cters&name=([\w ]+)
Hittade en färdigklass på PHPportalen som uppfyller det jag just nu behöver, dock är det en grej som är utdaterad och jag vet vad som behövs fixas vet bara inte HUR.
class tibia {
private $_charURL = 'http://www.tibia.com/community/?sub...ers&name=%s';
public function getCharacter($character) {
$character = str_replace(' ', '+', $character);
$url = sprintf($this->_charURL, ucfirst($character));
$content = file_get_contents($url);
if(strpos($content, 'Character Information') === false)
return false;
$content = str_replace(array('<br />', ' '), array('', ' '), $content);
$content = preg_replace('/<A HREF="([^>]+)">([^<]+)<\/A>/', '[url=\1]\2[/url]', $content);
preg_match_all('/(Name|Sex|Profession|Level|Residence|Last login|Comment|Account Status|Guild membership|World):(?:<\/?[^>]+>){2}([^<]+)/', $content, $matches);
$data = array();
$count = count($matches[0]);
for($i = 0; $i < $count; $i++) {
$var = strtolower($matches[1][$i]);
$var = str_replace(' ', '_', $var);
$value = html_entity_decode($matches[2][$i]);
$data[$var] = $value;
}
return $data;
}
}
I tibia kan man byta värld, om man bytar värld så kommer den att lista på karaktärsvyn på tibia.com "former world" före world, hur gör jag för att få den att skall läsa in WORLD och inte former world som "world"? (alltså world i regexpn tar formerworld om det finns :<)
Vad få du på $content? Gör en kontroll om du kan och se om den börjar med World, men om du ha " world:" som text så kommer det inte hjälpa:
preg_match_all('/(Name|Sex|Profession|Level|Residence|Last login|Comment|Account Status|Guild membership|^World):(?:<\/?[^>]+>){2}([^<]+)/', $content, $matches);Kunde inte testa det igår, då tibia.com var ostabil. I vilket fall, ^innebär väl att det måste börja på World, eller har jag missförstått något? I vilket fall fungerar inte det.
$data = $tibia->getCharacter('Herrop');
echo $data['world'];
Returnerar alltid ett null värde när ^world är med i leken.
Vad få du i:
$content = preg_replace('/<A HREF="([^>]+)">([^<]+)<\/A>/', '[url=\1]\2[/url]', $content);ASPKolls kod (som är mitt fel) klipper bort för långa ord, så kan du postar din kod på http://aspkoll.se/code/ så bli det lite lättare att se vad du har för url som du scrapar ifrån.
Oj, själklart skall jag göra det.
KOD (Hela Test.php): http://www.aspkoll.se/code/Index.asp?id=651
Där återfinner du url, fullständig kod jag jobbar med. För karaktärs namn, fyll i Herrop (en karaktär jag vet existerar)
preg_match_all('/>(Name|Sex|Profession|Level|Residence|Last login|Comment|Account Status|Guild membership|World):(?:<\/?[^>]+>){2}([^<]+)/', $content, $matches);Sen skall du nog bygga in din funktion i din klass, sen vet jag inte hur det är med PHP, men det känns onödigt att skapa ett objekt innan du behöver använda den, skapar upp ditt $tibia = new tibia; inne i din if fråga, det är bara där du använder den ändå.
så här hade jag gjort: http://www.aspkoll.se/code/Index.asp?id=652 ... på ett ungefär.