get_meta_tags () est une fonction pratique intégrée en php pour extraire le contenu de <meta name = "..."> tags à partir de fichiers html distants ou locaux. Il est souvent utilisé pour explorer les mots clés de page ou des descriptions. Cependant, dans une utilisation réelle, les développeurs rencontreront divers problèmes: le titre ne peut pas être extrait, le mot-clé est vide, le codage des caractères est incorrect, la demande distante a échoué, la méthode de rédaction de balises META n'est pas standardisée, etc. Cet article résume des problèmes, des causes et des contre-mesures plus robustes (y compris le code d'échantillon PHP réplicable).
get_meta_tags (string $ filename, bool $ use_include_path = false) : il lit le fichier et essaie d'analyser <meta name = "xxx" contenu = "yyy"> , renvoyant un array associatif Name => contenu (tout nom en deux).
Il n'obtient pas le contenu <title> TAG (c'est-à-dire le titre de la page), ni l'analyse des métas avec des attributs non noms tels que <méta propriété = "og: ..."> ou <meta charset = "..."> .
Ses exigences pour HTML sont relativement strictes: la méta doit exister sous la forme de name = "..." et de contenu = "..." , et l'ordre des attributs ou des pauses de ligne peut parfois affecter l'analyse.
Conclusion : Si vous avez besoin de la page <tight> ou META utilise des propriétés (comme Open Graph), get_meta_tags () ne suffit pas pour l'utiliser seul.
Cause : get_meta_tags () ne résout pas <Titre> .
Solution : Utilisez DomDocument ou régulier (non recommandé) pour analyser <Title> . Exemple ( DomDocument recommandé):
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">fetch_title</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$html</span></span></span><span>) {
</span><span><span class="hljs-variable">$dom</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMDocument</span></span><span>();
</span><span><span class="hljs-comment">// suppress warnings for malformed HTML</span></span><span>
@</span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">loadHTML</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, LIBXML_NOWARNING | LIBXML_NOERROR);
</span><span><span class="hljs-variable">$nodes</span></span><span> = </span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getElementsByTagName</span></span><span>(</span><span><span class="hljs-string">'title'</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$nodes</span></span><span>->length ? </span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$nodes</span></span><span>-></span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>)->textContent) : </span><span><span class="hljs-literal">null</span></span><span>;
}
</span></span>Si vous avez besoin d'obtenir à distance le contenu de la page, veuillez d'abord réduire le HTML avec File_get_Contents / Curl , puis le transmettre à fetch_title () .
Raisons possibles :
Html Meta n'est pas écrit dans Name = "..." + content = "..." (comme propriété = "og: ..." ou http-equiv ).
Meta est à l'extérieur de <Aad> (ou la structure de la page n'est pas standardisée).
Le codage ou la nomenclature du caractère fait échouer l'analyse.
allow_url_fopen est désactivé et l'URL ne peut pas être utilisé.
Solution :
Vérifiez le type d'attribut Meta et utilisez DomDocument pour vérifier Meta-> getAttribute ('name') et meta-> getAttribute ('propriété') si nécessaire.
Pour les URL distantes, utilisez d'abord Curl pour obtenir le contenu de la page (plus flexible), puis utilisez DOM pour analyser.
Si Allow_URL_FOPEN est désactivé, utilisez plutôt Curl .
Exemple: utilisez Curl + Dom pour extraire les métas communs (y compris le nom et la propriété ) et le titre:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">fetch_html</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$url</span></span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>) {
</span><span><span class="hljs-variable">$ch</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt_array</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, [
CURLOPT_RETURNTRANSFER => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_FOLLOWLOCATION => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_MAXREDIRS => </span><span><span class="hljs-number">5</span></span><span>,
CURLOPT_CONNECTTIMEOUT => </span><span><span class="hljs-variable">$timeout</span></span><span>,
CURLOPT_TIMEOUT => </span><span><span class="hljs-variable">$timeout</span></span><span>,
CURLOPT_USERAGENT => </span><span><span class="hljs-string">'Mozilla/5.0 (compatible; PHP script)'</span></span><span>,
]);
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_exec</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-variable">$err</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_error</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$html</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RuntimeException</span></span><span>(</span><span><span class="hljs-string">"Failed to fetch URL: <span class="hljs-subst">$err</span></span></span><span>");
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$html</span></span><span>;
}
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">parse_meta_and_title</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$html</span></span></span><span>) {
</span><span><span class="hljs-variable">$dom</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DOMDocument</span></span><span>();
@</span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">loadHTML</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, LIBXML_NOWARNING | LIBXML_NOERROR);
</span><span><span class="hljs-variable">$result</span></span><span> = [</span><span><span class="hljs-string">'title'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-string">'meta'</span></span><span> => []];
</span><span><span class="hljs-comment">// title</span></span><span>
</span><span><span class="hljs-variable">$titles</span></span><span> = </span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getElementsByTagName</span></span><span>(</span><span><span class="hljs-string">'title'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$titles</span></span><span>->length) {
</span><span><span class="hljs-variable">$result</span></span><span>[</span><span><span class="hljs-string">'title'</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$titles</span></span><span>-></span><span><span class="hljs-title function_ invoke__">item</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>)->textContent);
}
</span><span><span class="hljs-comment">// metas</span></span><span>
</span><span><span class="hljs-variable">$metas</span></span><span> = </span><span><span class="hljs-variable">$dom</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getElementsByTagName</span></span><span>(</span><span><span class="hljs-string">'meta'</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$metas</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$meta</span></span><span>) {
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getAttribute</span></span><span>(</span><span><span class="hljs-string">'name'</span></span><span>);
</span><span><span class="hljs-variable">$prop</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getAttribute</span></span><span>(</span><span><span class="hljs-string">'property'</span></span><span>); </span><span><span class="hljs-comment">// og: attendez</span></span><span>
</span><span><span class="hljs-variable">$http_equiv</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getAttribute</span></span><span>(</span><span><span class="hljs-string">'http-equiv'</span></span><span>);
</span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getAttribute</span></span><span>(</span><span><span class="hljs-string">'content'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$name</span></span><span>) {
</span><span><span class="hljs-variable">$result</span></span><span>[</span><span><span class="hljs-string">'meta'</span></span><span>][</span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$name</span></span><span>)] = </span><span><span class="hljs-variable">$content</span></span><span>;
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$prop</span></span><span>) {
</span><span><span class="hljs-variable">$result</span></span><span>[</span><span><span class="hljs-string">'meta'</span></span><span>][</span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$prop</span></span><span>)] = </span><span><span class="hljs-variable">$content</span></span><span>;
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$http_equiv</span></span><span>) {
</span><span><span class="hljs-variable">$result</span></span><span>[</span><span><span class="hljs-string">'meta'</span></span><span>][</span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$http_equiv</span></span><span>)] = </span><span><span class="hljs-variable">$content</span></span><span>;
}
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
}
</span></span>raison :
Le codage utilisé par la page (tel que UTF-8, GBK) ne correspond pas au comportement par défaut de DomDocument :: LoadHTML .
L'en-tête HTTP est incompatible avec les informations de Charset dans la méta de la page.
Solution :
Convertissez HTML en UTF-8 (sinon) avant LoadHTML () et injecter <Meta Http-Equiv = "Content-Type" Content = "Text / HTML; charSet = UTF-8"> dans la tête, de sorte que DomDocument est plus facile à reconnaître.
Utilisez MB_DETECT_ENCODING () pour déterminer le codage et le convertir en UTF-8.
Exemple:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalize_to_utf8</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$html</span></span></span><span>) {
</span><span><span class="hljs-comment">// Essayer de passer BOM ou meta Encodage du juge,Si vous n'êtes pas sûr, utilisez-le mb_detect_encoding</span></span><span>
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/<meta.+?charset=["\']?\s*([a-zA-Z0-9\-\_]+)\b/i'</span></span><span>, </span><span><span class="hljs-variable">$html</span></span><span>, </span><span><span class="hljs-variable">$m</span></span><span>)) {
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$m</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>]);
}
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$encoding</span></span><span>) {
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, [</span><span><span class="hljs-string">'UTF-8'</span></span><span>,</span><span><span class="hljs-string">'GB2312'</span></span><span>,</span><span><span class="hljs-string">'GBK'</span></span><span>,</span><span><span class="hljs-string">'ISO-8859-1'</span></span><span>], </span><span><span class="hljs-literal">true</span></span><span>);
}
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$encoding</span></span><span> && </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$encoding</span></span><span>) !== </span><span><span class="hljs-string">'UTF-8'</span></span><span>) {
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
}
</span><span><span class="hljs-comment">// assurer loadHTML Identifier comme UTF-8</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stripos</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>, </span><span><span class="hljs-string">'<meta http-equiv="Content-Type"'</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/<head([^>]*)>/i'</span></span><span>, </span><span><span class="hljs-string">'<head$1><meta http-equiv="Content-Type" content="text/html; charset=utf-8">'</span></span><span>, </span><span><span class="hljs-variable">$html</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$html</span></span><span>;
}
</span></span> Cause : la fonction est basée sur un analyseur simple en interne, et il ne rencontrera pas de lignes de nouvelles, de commentaires ou de personnages étranges dans la propriété de contenu .
Solution : il est mieux toléré les défauts avec DomDocument ; ou prétraitez d'abord la tête en HTML (supprimer les commentaires, aplatir les attributs à la même ligne), puis appeler get_meta_tags () (pas très élégant, mais peut être utilisé comme remède à court terme).
Contre-mesures :
Utilisez Curlopt_Userager pour configurer le navigateur commun UA.
Définissez raisonnable Curlopt_timeout et Curlopt_ConnectTimeout .
Prise en charge de Curlopt_Follocation (notez qu'il doit être activé dans certains environnements).
Si le site a une stratégie anti-Crawl (code de vérification, rendu JS, anti-robot), considérez:
Disguique simple de la demande de demande (mais respectez l'accord de droit et de robots de site Web).
Utilisez Crawlers avec JS (comme les navigateurs sans tête), mais cela dépasse la portée native PHP.
Traitez les codes d'état HTTP et réessayez à la défaillance (secours à l'effort), mais évitez les demandes excessives.
Exemple: bouclez avec des en-têtes:
<span><span><span class="hljs-title function_ invoke__">curl_setopt_array</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, [
CURLOPT_RETURNTRANSFER => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_FOLLOWLOCATION => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_MAXREDIRS => </span><span><span class="hljs-number">5</span></span><span>,
CURLOPT_CONNECTTIMEOUT => </span><span><span class="hljs-number">10</span></span><span>,
CURLOPT_TIMEOUT => </span><span><span class="hljs-number">15</span></span><span>,
CURLOPT_USERAGENT => </span><span><span class="hljs-string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'</span></span><span>,
CURLOPT_HTTPHEADER => [
</span><span><span class="hljs-string">'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'</span></span><span>,
</span><span><span class="hljs-string">'Accept-Language: en-US,en;q=0.5'</span></span><span>,
],
]);
</span></span>Ceci est la conception de la fonction: le nom de clé sera converti en minuscules. Si votre entreprise repose sur des champs sensibles à la casse, soyez conscient des noms de clés standardisés.
Voici une fonction combinée: utilisez d'abord Curl pour obtenir HTML, puis encodiez la normalisation, et utilisez enfin DOM pour analyser et renvoyer des champs communs et toutes les listes de méta.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">fetch_page_info</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$url</span></span></span><span>) {
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fetch_html</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-title function_ invoke__">normalize_to_utf8</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>);
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">parse_meta_and_title</span></span><span>(</span><span><span class="hljs-variable">$html</span></span><span>);
</span><span><span class="hljs-comment">// Normisation des champs communs:title, keywords, description</span></span><span>
</span><span><span class="hljs-variable">$info</span></span><span> = [];
</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'title'</span></span><span>] = </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'title'</span></span><span>] ?? </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'meta'</span></span><span>] ?? [];
</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'keywords'</span></span><span>] = </span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'keywords'</span></span><span>] ?? (</span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'og:site_name'</span></span><span>] ?? </span><span><span class="hljs-literal">null</span></span><span>);
</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'description'</span></span><span>] = </span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'description'</span></span><span>] ?? (</span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'og:description'</span></span><span>] ?? </span><span><span class="hljs-literal">null</span></span><span>);
</span><span><span class="hljs-comment">// Retour à tous meta Pour une utilisation ultérieure</span></span><span>
</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'meta_all'</span></span><span>] = </span><span><span class="hljs-variable">$meta</span></span><span>;
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$info</span></span><span>;
}
</span><span><span class="hljs-comment">// Utiliser l'exemple:</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">'https://example.com'</span></span><span>;
</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fetch_page_info</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_export</span></span><span>(</span><span><span class="hljs-variable">$info</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>Si vous avez besoin de ramper un grand nombre de pages en lots, veuillez ne pas ramper à la même URL en temps réel à chaque fois. Il est recommandé d'utiliser des caches (redis, memcached ou cache de fichier) et définir des politiques d'expiration appropriées, telles que 1 heure ou 24 heures, selon la fréquence des mises à jour de la page.
Contrôlez le nombre de rampes simultanées pour éviter d'être bloquées par le site cible ou d'être trop à haute pression de son hôte.
Les pages d'accueil prioritaires rampantes et les pages importantes pour les grands sites sont évitées rampant aveuglément tous les liens.
La méthode d'écriture des balises Meta n'est pas uniforme : de nombreux sites modernes utilisent OG: Title et Twitter: Titre , qui ne sont pas dans la gamme cible de get_meta_tags () . L'utilisation de DOM peut capturer tous les types à la fois.
Meta Tag Duplicate : Si plusieurs méta-noms apparaissent sur la page (peuvent être utilisés pour le contrôle multilingue ou de version), votre logique d'analyse devrait décider de prendre le premier, de les fusionner ou de les enregistrer tous.
Entités HTML dans Meta : Faites attention aux entités de décodage telles que & amp; , & # 123; ( html_entity_decode () ).
Robots / Meta-Refresh : Si vous avez besoin de gérer Meta Refresh (Redirection) ou Robots NoIndex, veuillez vérifier spécifiquement Http-Equiv et les propriétés correspondantes.
Respectez Robots.txt et la loi : veuillez consulter le site cible Robots.txt et les conditions de service avant de ramper, respecter la confidentialité et le droit d'auteur, et ne pas ramper de contenu restreint.
Confirmez si vous souhaitez ramper <Meta Name = "Keywords"> ou <Title> (les deux sont des outils différents).
S'il s'agit d'un rampage éloigné: utilisez d'abord Curl pour obtenir et imprimer le HTML d'origine, et consultez l'écriture et l'encodage spécifiques de Meta.
Vérifiez Charset , s'il n'est pas UTF-8, convertissez d'abord, puis analysez.
Si get_meta_tags () ne peut pas être extrait, passez à DomDocument et capture le nom , la propriété et Http-Equiv en même temps.
Gérer les erreurs HTTP, les mécanismes de redirection et anti-rampe (définir les politiques UA, délai d'expiration et réessayer de manière appropriée).
Implémentez les caches de pages importantes pour éviter les demandes en double.
get_meta_tags () est simple et facile à utiliser, mais il s'applique uniquement aux scénarios standard et simple Meta Name = "..." . Il n'envient pas la méta de type <tapie> ou de la propriété .
Pour les pages complexes, non standard ou non UTF-8, il est recommandé d'utiliser une combinaison de DomDocument Curl +: plus flexible et plus robuste.
Le codage, la défaillance de la demande à distance, la rampe inversée et la méta-écriture sont des points de défaut courants. La plupart des problèmes peuvent être localisés et résolus dans l'ordre de dépannage ci-dessus.
Si vous avez besoin de traiter des pages qui nécessitent un rendu JS (spa, dynamique chargement de méta), vous devez utiliser une solution de rendu côté navigateur ou côté serveur (hors de la portée native PHP).