Script PHP pour récupérer les metatags d'une page HTML

Voici un script PHP qui récupère les metatags présents sur une page HTML et qui les stocks dans un tableau.
Il existe une fonction toute prête get_meta_tags, mais celle-ci ne permet que de récupérer les meta de type name.

Pré-requis / Difficultés

Les fonctions suivantes fonctionnent avec PHP 4, 5 et 7. La seconde fonction utilise les regex, un cours viendra sur la conception des regex bientôt.

Difficulté
Moyen

Première méthode : get_meta_tags

Comme vu plus haut, la fonction get_meta_tags intégrée dans PHP permet de récupérer facilement les meta de type name d'une page HTML et les fournis sous forme de tableau.

La commande est simple, pour l'exemple nous allons récupérer les meta-tags de la page d'accueil du site :

<?php
// On stocke les balises dans le tableau $tags
$tags = get_meta_tags('https://www1.zonewebmaster.eu/');
// Affiche les balises demandées 
echo $tags['generator'];
echo $tags['robots'];
echo $tags['keywords'];

Le script affichera les lignes suivantes :

DokuWiki
index,follow
accueil

Seconde méthode : récupère toutes les balises meta

Pour les besoins d'un script PHP, j'avais besoin de récupérer le contenu des balises opengraph. J'ai donc utilisé la fonction suivante qui permet de récupérer l'ensemble des balises meta d'une page HTML.
Pour cela nous créons une fonction qui s'appelle getMeta.

<?php
function getMeta($page)
{
$pattern = '
  ~<\s*meta\s
 
    (?=[^>]*?
    \b(?:name|property|http-equiv)\s*=\s*
    (?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
    ([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
  )
  [^>]*?\bcontent\s*=\s*
    (?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
    ([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
  [^>]*>
 
  ~ix';
 
  if(preg_match_all($pattern, $url, $out))
    return array_combine($out[1], $out[2]);
  return array();
}
 
// usage
$page = file_get_contents('https://www1.zonewebmaster.eu');
if ($page !== false{
  $tags = getMeta($page); // Appel la fonction
}

La fonction utilise un regex permettant de sélectionner toutes les balises meta (name,property,http-equiv), le regex est stocké dans la variable $pattern.
La fonction retourne un tableau vide s'il n'y a pas de metatag disponible sur la page HTML. Sinon tous les metatags sont stockés dans le tableau $tags.
La variable $page contient le code HTML de la page à lire.

Auteurs et sources