Autor Zpráva
tcladin
Profil
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
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
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">
není mezera za content="text/html; ? Jak bys to řešil?

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...
tcladin
Profil
Ahojte,
dořešeno zde

get_headers() Redirection limit reached, aborting. failed to open stream: Operation now in progress

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: