Moikka,
Tarkoituksena on saada selville tiedostotyyppi (mime?) annetusta osoitteesta ja muotona text/html, text/plain jne..
Olen yrittänyt monellakin tapaa mutta ongelmia tulee aina vastaan.. Joko googlella löytämäni funktiot eivät toimi palvelimellani (jonkinnäköisiä lisäosia) tai tekemäni purkka ei toimi luotettavasti..
Tässä viimeisin:
$url = 'http://osoite.com'; $mime = get_headers($url, 1); if(is_array($mime['Content-Type'])){ $mime = $mime['Content-Type'][0]; }else{ $mime = $mime['Content-Type']; } echo $mime;
Tällä rimpsulla saadaan esimerkkkinä tälläisiä:
text/html
text/html;
text/html; charset=utf-8
tai joissakin tapauksissa kokonaan tyhjä.
Eli get_headersillä saadaan joka sivulta erillaisia taulukoita joista halutun tiedon saaminen ulos tuntuu käsittämättömän vaikealta.
Kenelläkään tiedossa luotettavaa tapaa saada tämä tiedostotyyppi ulos?
Kiitos avusta,
-t0ll0
Siis mikä tuossa on ongelmana? Sehän näyttää toimivan mainiosti. Katsot vaan että jos tuloksessa on ; niin otat vain sitä ennen olevan osan.
Kuten kerroin niin joiltakin sivuilta palauttaa kokonaan tyhjän.
Vai onko tämä sitten se "luotettavin" keino selvittää tämä asia?
edit.
Sivuilta joilta palauttaa tyhjän kuitenkin näkyy seuraavaa:
print_r(get_headers($url, 1)); [Content-type] => Array ( [0] => text/html; charset=latin1 [1] => text/html; charset=latin1 )
Ensinnäkin, eihän tuokaan ole millään tavalla luotettava. Palvelin perustaa käsityksensä usein tiedoston päätteeseen, tai poikkeustapauksessa palvelin voi jättää tyypin kokonaan ilmoittamatta. Ainoa luotettava tapa olisi ladata tiedosto ja tunnistaa sen sisältö.
Jos nyt kuitenkin ongelma on tuon palvelimelta tulevan arvon muuttaminen tuttuun muotoon, alla on koko joukko erilaisia ratkaisuja. Kannattaisi itsekin opetella käsittelemään tekstiä PHP:llä.
function f1($str) { $arr = explode(";", $str, 2); return trim($arr[0]); } function f2($str) { $pos = strpos($str, ";"); if ($pos !== false) { $str = substr($str, 0, $pos); } return trim($str); } function f3($str) { return preg_replace('#^\\s*([^;]*?)\\s*(?:;.*)?$#s', '$1', $str); }
Näethän jälkimmäisessä viestissäsi, että palvelin palauttaa "Content-type"-otsikon (type pienellä) taulukkomuodossa (ilmeisesti siis useamman esiintymän). Ehkä sinun pitää tehdä jotain tällaista:
function get_content_type($url) { foreach (get_headers($url, 1) as $nimi => $arvo) { if (strcasecmp($nimi, "Content-Type") == 0) { if (is_array($arvo)) { $arvo = end($arvo); } return preg_replace('#^\\s*([^;]*?)\\s*(?:;.*)?$#s', '$1', $arvo); } } }
Ongelma ei suinkaan ole palautusarvon käsittely haluamaani muotoon vaan se että saatu arvo on joiltakin sivuilta tyhjä.
Metabolix huomasi sen mikä itseltäni jäi huomaamatta ja nyt toimii :)
Kiitoksia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.