Autor | Zpráva | ||
---|---|---|---|
tcladin Profil |
#1 · Zasláno: 28. 12. 2009, 03:15:03 · Upravil/a: tcladin
Ahoj,
snažím se získat metatagy "cizích" webů. Našel jsem funkci get_meta_tags, mysle jsem že mám vyhráno, ale záhy sem zjistil, že pokud mají stránky různé kodování nezobrazují se mi metatagy správně. Našel sem teda další funkci iconv. Vše funguje dobře, jen bych teď potřeboval další funkci co by mi zjišťovala charset. Tady se nedovedu pohnout dál. Našel sem http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_content_type#Code ,ale nějak mi to nejde rozchodit. Prosím o pomoc. echo "<h2>metatagy odkazu</h2>"; $tags = get_meta_tags($odkaz1['odkaz']); echo "author: ".$tags['author']."<br>"; echo "keywords orig: ".$tags['keywords']."<br>"; echo "keywords transl: ".iconv('windows-1250', 'UTF-8//TRANSLIT//IGNORE', $tags['keywords'])."<br>"; echo "description: ".$tags['description']."<br>"; |
||
Majkl578 Profil |
#2 · Zasláno: 28. 12. 2009, 03:57:38
Napadly mě dvě řešení.
To první je použití funkce get_headers() a vytažení kódování z ní. foreach (get_headers('http://seznam.cz') as $header) { if (preg_match('~content\-type:.*charset=(?<encoding>[^ ]+)~i', $header, $matches)) { break; } } echo isset($matches) ? $matches['encoding'] : 'not found'; To druhé je založené na použití rozšíření fileinfo, které je defaultně v php od verze 5.3, ve starších ručně přidané. $filename = tempnam('/tmp', 'php-mime-' . microtime());//vytvorime docasny soubor file_put_contents($filename, file_get_contents('http://seznam.cz'));//stahneme a ulozime stranku $f = new finfo(FILEINFO_MIME); preg_match('~charset=(?<encoding>[^ ]+)$~i', $f->file($filename), $matches); echo $matches['encoding']; unlink($filename);//smazene docasny soubor |
||
tcladin Profil |
#3 · Zasláno: 28. 12. 2009, 12:30:16 · Upravil/a: tcladin
Majkl578:
díky. Použiju asi oba způsoby nebo zejména ten druhý. Totiž sem zjistil, že HTTP hlavičky často neobsahují informaci o charset (asi by měly obsahovat, ale kodeři na to prdí?) První způsob sem použil bez změny, fungu je mi. Druhý způsob sem si musel přizpůsobit. jelikož hlásilo: Warning: tempnam() [function.tempnam]: open_basedir restriction in effect. File() is not within the allowed path(s): ... Pokusil sem se použít trik z http://www.php.net/manual/en/function.tempnam.php#93256, bohužel muj hosting je php 5.2.0 a jako na potvoru je funkce sys_get_temp_dir až pro (PHP 5 >= 5.2.1). Tak sem si pomohl jinak, tempem v ramci mojí domény. Podobně funkce finfo je (PHP >= 5.3.0, PECL fileinfo >= 0.1.0) pro mě bohužel nepoužitelná tak sem použil preg_match $filename = $tmp . '/php-mime-' . microtime();//vytvorime docasny soubor, $tmp je jmeno adresare pro docasne soubory file_put_contents($filename, file_get_contents($page));//stahneme a ulozime stranku $text = file_get_contents( $filename ); //vyhledani charset preg_match( '@<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s+charset=([^\s"]+))?@i', $text, $matches ); if ( isset( $matches[1] ) ) $mime = $matches[1]; if ( isset( $matches[3] ) ) $charset = $matches[3]; echo "metatag charset: $charset"."<br>"; unlink($filename);//smazene docasny soubor jeste jsem trochu vylepšil testem zadané URL který se provede před provedením foreach (get_headers('http://seznam.cz') as $header)... //test URL $headers = @get_headers($page, 1); $headers[0]=substr($headers[0],9,3); if ($headers[0] < 400 and $headers[0] !=""): $page_check = "OK"; else: $page_check = "KO"; endif; no díky ještě jednou. Já sem tvrdej amatér nesystematickej samouk. Charset si můžete ozkoušet na http://tcladin.cz/pokus/charset.php Jaj teď sem zkoušel charset pro tuhle stránku a charset pomocí metatagu se mi nenačte. myslíš že je to tím, že: v <meta http-equiv="content-type" content="text/html;charset=iso-8859-2"> Tak jsem to našel. Ano bylo to regulárním výrazem @<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s+charset=([^\s"]+))?@i změnil jsem jej na @<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s*charset=([^\s"]+))?@i' a vše šlape, navedla mě tahle stránka http://pavucina.webmark.cz/7/regularni-vyrazy-php-1-zaklady :-) Prosím co je pro kodování důležitější? HTTP hlavička nebo metatag? Vím asi by mělo mít shodnou hodnotu, ale obecně tomu tak není (např. tady http://hotel.cz/, souvisí s přesměrováním?). zatím se přikláním k metatagu. při zjišťování charset této URL nastává timeout http://www.cvtips.com/cv-examples.html, čím by to mohlo být? jak ukončit předčasně skrupt (apř. když trvá déle než 10s)? hmm, už zjištění charset běží, že by něco se zkoumanou stránkou? narazil sem na stránky u kterých neprobíhá test URL, jedná se o příspěvky na webtrh.cz, např. http://webtrh.cz/66997-fakturace-ramci-dph?p=416206. píše: Warning: get_headers() [function.get-headers]: Redirection limit reached, aborting. in /home/www/tcladin.cz/subdomains/www/include/funkce.php on line 583 Warning: get_headers(http://webtrh.cz/66997-fakturace-ramci-dph?p=416206) [function.get-headers]: failed to open stream: Operation now in progress in /home/www/tcladin.cz/subdomains/www/include/funkce.php on line 583 Ale nechápu proč , když podle http://www.seo-browser.com/results.php?user_agent=1&address=http%3A%2F%2Fwebtrh.cz%2F66997-fakturace-ramci-dph%3Fp%3D416206&action=Parse+URL je HTTP/1.1 200 OK ... . asi to bude mit neco spolecne s cool URL, ale u jinych cool URL funguje... |
||
Časová prodleva: 3 měsíce
|
|||
tcladin Profil |
#4 · Zasláno: 10. 4. 2010, 19:08:24 · Upravil/a: tcladin
|
||
Časová prodleva: 14 let
|
0