Obtenir le titre de site via un lien
-
30-09-2019 - |
Question
Remarquez comment Google Nouvelles a des sources sur le fond de chaque extrait de l'article.
The Guardian - ABC Nouvelles - Reuters - Bloomberg
Je suis en train d'imiter cela.
Par exemple, lors de la présentation de la http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/
URL Je veux revenir The Washington Times
Comment est-ce possible avec php?
La solution
Ma réponse se développe sur la réponse de @AI W d'utiliser le titre de la page. Voici le code pour accomplir ce qu'il a dit.
<?php
function get_title($url){
$str = file_get_contents($url);
if(strlen($str)>0){
$str = trim(preg_replace('/\s+/', ' ', $str)); // supports line breaks inside <title>
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title); // ignore case
return $title[1];
}
}
//Example:
echo get_title("http://www.washingtontimes.com/");
?>
SORTIE
Washington Times - Politique, Briser Nouvelles, Nouvelles Etats-Unis et du monde
Comme vous pouvez le voir, ce n'est pas exactement ce que Google utilise, donc ce qui conduit à croire que moi qu'ils obtiennent un nom d'hôte URL et correspondent à leur propre liste.
http://www.washingtontimes.com/ => Le Washington Times
Autres conseils
$doc = new DOMDocument();
@$doc->loadHTMLFile('http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/');
$xpath = new DOMXPath($doc);
echo $xpath->query('//title')->item(0)->nodeValue."\n";
Sortie:
commission de la dette tombe à court vote test - Washington Times
Il est évident que vous devez également mettre en œuvre la gestion des erreurs de base.
Vous pourriez récupérer le contenu de l'URL et faire une recherche d'expression régulière pour le contenu de l'élément title
.
<?php
$urlContents = file_get_contents("http://example.com/");
preg_match("/<title>(.*)<\/title>/i", $urlContents, $matches);
print($matches[1] . "\n"); // "Example Web Page"
?>
Ou, si vous ne voulez pas utiliser une expression régulière (pour correspondre à quelque chose de très près du haut du document), vous pouvez utiliser un objet DOMDocument :
<?php
$urlContents = file_get_contents("http://example.com/");
$dom = new DOMDocument();
@$dom->loadHTML($urlContents);
$title = $dom->getElementsByTagName('title');
print($title->item(0)->nodeValue . "\n"); // "Example Web Page"
?>
Je laisse à vous de décider quelle méthode vous convient le mieux.
Utilisation get_meta_tags () à partir du domaine page d'accueil, pour New York Times ramène quelque chose qui pourrait tronquer besoin, mais pourrait être utile.
$b = "http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/" ;
$url = parse_url( $b ) ;
$tags = get_meta_tags( $url['scheme'].'://'.$url['host'] );
var_dump( $tags );
comprend la description « The Washington Times offre de rupture nouvelles et des commentaires sur les questions qui touchent l'avenir de notre nation. »
<?php
$ch = curl_init("http://www.example.com/");
$fp = fopen("example_homepage.txt", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
?>
PHP manuel sur la correspondance Perl regex
<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>
Et mettre les deux ensemble:
<?php
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, "example.com");
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
$pattern = '/[<]title[>]([^<]*)[<][\/]titl/i';
preg_match($pattern, $output, $matches);
print_r($matches);
// close curl resource to free up system resources
curl_close($ch);
?>
Je ne peux pas promettre cet exemple ne fonctionnera que je n'ai pas PHP, mais il devrait vous aider à démarrer.
Si vous êtes prêt à utiliser un service tiers pour cela, je vient de construire un www.runway7.net / radar
Vous donne le titre, la description et bien plus encore. Par exemple, essayez votre exemple sur radar. ( http://radar.runway7.net/?url=http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/ )
Vous pouvez également utiliser simple Html Dom Parser :
<?php
require_once('simple_html_dom.php');
$html = file_get_html('http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/');
echo $html->find('title', 0)->innertext . "<br>\n";
echo $html->find('div[class=entry-content]', 0)->innertext;
i a écrit une fonction pour gérer:
function getURLTitle($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$charset = '';
if($contentType && preg_match('/\bcharset=(.+)\b/i', $contentType, $matches)){
$charset = $matches[1];
}
curl_close($ch);
if(strlen($content) > 0 && preg_match('/\<title\b.*\>(.*)\<\/title\>/i', $content, $matches)){
$title = $matches[1];
if(!$charset && preg_match_all('/\<meta\b.*\>/i', $content, $matches)){
//order:
//http header content-type
//meta http-equiv content-type
//meta charset
foreach($matches as $match){
$match = strtolower($match);
if(strpos($match, 'content-type') && preg_match('/\bcharset=(.+)\b/', $match, $ms)){
$charset = $ms[1];
break;
}
}
if(!$charset){
//meta charset=utf-8
//meta charset='utf-8'
foreach($matches as $match){
$match = strtolower($match);
if(preg_match('/\bcharset=([\'"])?(.+)\1?/', $match, $ms)){
$charset = $ms[1];
break;
}
}
}
}
return $charset ? iconv($charset, 'utf-8', $title) : $title;
}
return $url;
}
il va chercher le contenu de la page Web, et tente d'obtenir le document charset encodage par ((de la plus haute priorité au plus bas):
- Un paramètre HTTP "charset" dans un champ "Content-Type".
- Une déclaration META "http-equiv" sur "Content-Type" et un ensemble de valeurs pour "charset".
- Le jeu d'attribut charset sur un élément qui désigne une ressource externe.
(voir http://www.w3.org/TR/html4/charset. html )
et utilise ensuite iconv
à titre de converti à l'encodage utf-8
.
Obtenir le titre de site via le lien et le titre de converti au codage de caractères UTF-8:
https://gist.github.com/kisexu/b64bc6ab787f302ae838
function getTitle($url)
{
// get html via url
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$html = curl_exec($ch);
curl_close($ch);
// get title
preg_match('/(?<=<title>).+(?=<\/title>)/iU', $html, $match);
$title = empty($match[0]) ? 'Untitled' : $match[0];
$title = trim($title);
// convert title to utf-8 character encoding
if ($title != 'Untitled') {
preg_match('/(?<=charset\=).+(?=\")/iU', $html, $match);
if (!empty($match[0])) {
$charset = str_replace('"', '', $match[0]);
$charset = str_replace("'", '', $charset);
$charset = strtolower( trim($charset) );
if ($charset != 'utf-8') {
$title = iconv($charset, 'utf-8', $title);
}
}
}
return $title;
}
J'essaie d'éviter des expressions régulières quand il est pas nécessaire, je l'ai fait une fonction pour obtenir le titre de site Web avec boucle et DOMDocument ci-dessous.
function website_title($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// some websites like Facebook need a user agent to be set.
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36');
$html = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument;
@$dom->loadHTML($html);
$title = $dom->getElementsByTagName('title')->item('0')->nodeValue;
return $title;
}
echo website_title('https://www.facebook.com/');
ci-dessus renvoie les éléments suivants: Bienvenue sur Facebook - Connexion, inscrivez-vous ou en savoir plus