Accueil > Forum > > > > Récupérer le contenu des balises meta d'un page HTML distante
Récupérer le contenu des balises meta d'un page HTML distante
mardi 2 février 2010 à 15:11:57 |
Récupérer le contenu des balises meta d'un page HTML distante

Midionos
|
Je travaille sur un projet de Terminale SSI.
Dans le cadre de ce projet je cherche à récupérer les balises meta d'un page HTML distante.
J'ai récupérer des fonctions JS qui me permettent de le faire ( voir ci-dessous ).
J'arrive à récupérer les balises métas tant qu'elles sont sur le même site que ma page d'où je les appelle.
Exemple :
J'appelle les metas à partir de cette page : http://webteo.free.fr/index.php et les meta sont dans http://webteo.free.fr/PWS.html
Par contre :
Si mes balises métas sont sur un autre site ( par exemple : http://dede.fr/PWS.html ), alors je n'y arrive plus.
Ce que j'écris pour avoir les balises métas :
Code Javascript : tags = get_meta_tags ('http://[adresse du site où sont les métas.]/PWS.html');
Les fonctions que j'utilise :
Code Javascript : function file_get_contents (url, flags, context, offset, maxLen) {
// Read the entire file into a string
//
// version: 906.111
// discuss at: http://phpjs.org/functions/file_get_contents
// + original by: Legaev Andrey
// + input by: Jani Hartikainen
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Brett Zamir (http://brett-zamir.me)
// + input by: Raphael (Ao) RUDLER
// + bugfixed by: Brett Zamir (http://brett-zamir.me)
// % note 1: This function uses XmlHttpRequest and cannot retrieve resource from different domain without modifications.
// % note 2: Synchronous by default (as in PHP) so may lock up browser. Can
// % note 2: get async by setting a custom "phpjs.async" property to true and "notification" for an
// % note 2: optional callback (both as context params, with responseText, and other JS-specific
// % note 2: request properties available via 'this'). Note that file_get_contents() will not return the text
// % note 2: in such a case (use this.responseText within the callback). Or, consider using
// % note 2: jQuery's: $('#divId').load('http://url') instead.
// % note 3: The context argument is only implemented for http, and only partially (see below for
// % note 3: "Presently unimplemented HTTP context options"); also the arguments passed to
// % note 3: notification are incomplete
// * example 1: file_get_contents('http://kevin.vanzonneveld.net/pj_test_supportfile_1.htm');
// * returns 1: '123'
// Note: could also be made to optionally add to global $http_response_header as per http://php.net/manual/en/reserved.variables.httpresponseheader.php
var tmp, headers = [], newTmp = [], k=0, i=0, href = '', pathPos = -1, flagNames = 0, content = null, http_stream = false;
var func = function (value) { return value.substring(1) !== ''; };
// BEGIN REDUNDANT
this.php_js = this.php_js || {};
this.php_js.ini = this.php_js.ini || {};
// END REDUNDANT
var ini = this.php_js.ini;
context = context || this.php_js.default_streams_context || null;
if (!flags) {flags = 0;}
var OPTS = {
FILE_USE_INCLUDE_PATH : 1,
FILE_TEXT : 32,
FILE_BINARY : 64
};
if (typeof flags === 'number') { // Allow for a single string or an array of string flags
flagNames = flags;
}
else {
flags = [].concat(flags);
for (i=0; i < flags.length; i++) {
if (OPTS[flags[i]]) {
flagNames = flagNames | OPTS[flags[i]];
}
}
}
if (flagNames & OPTS.FILE_BINARY && (flagNames & OPTS.FILE_TEXT)) { // These flags shouldn't be together
throw 'You cannot pass both FILE_BINARY and FILE_TEXT to file_get_contents()';
}
if ((flagNames & OPTS.FILE_USE_INCLUDE_PATH) && ini.include_path &&
ini.include_path.local_value) {
var slash = ini.include_path.local_value.indexOf('/') !== -1 ? '/' : '\\';
url = ini.include_path.local_value+slash+url;
}
else if (!/^(https?|file):/.test(url)) { // Allow references within or below the same directory (should fix to allow other relative references or root reference; could make dependent on parse_url())
href = this.window.location.href;
pathPos = url.indexOf('/') === 0 ? href.indexOf('/', 8)-1 : href.lastIndexOf('/');
url = href.slice(0, pathPos+1)+url;
}
if (context) {
var http_options = context.stream_options && context.stream_options.http;
http_stream = !!http_options;
}
if (!context || http_stream) {
var req = this.window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
if (!req) {throw new Error('XMLHttpRequest not supported');}
var method = http_stream ? http_options.method : 'GET';
var async = !!(context && context.stream_params && context.stream_params['phpjs.async']);
if (ini['phpjs.ajaxBypassCache'] && ini['phpjs.ajaxBypassCache'].local_value) {
url += (url.match(/\?/) == null ? "?" : "&") + (new Date()).getTime(); // Give optional means of forcing bypass of cache
}
req.open(method, url, async);
if (async) {
var notification = context.stream_params.notification;
if (typeof notification === 'function') {
// Fix: make work with req.addEventListener if available: https://developer.mozilla.org/En/Using_XMLHttpRequest
if (0 && req.addEventListener) { // Unimplemented so don't allow to get here
/*
req.addEventListener('progress', updateProgress, false);
req.addEventListener('load', transferComplete, false);
req.addEventListener('error', transferFailed, false);
req.addEventListener('abort', transferCanceled, false);
*/
}
else {
req.onreadystatechange = function (aEvt) { // aEvt has stopPropagation(), preventDefault(); see https://developer.mozilla.org/en/NsIDOMEvent
// Other XMLHttpRequest properties: multipart, responseXML, status, statusText, upload, withCredentials
/*
PHP Constants:
STREAM_NOTIFY_RESOLVE 1 A remote address required for this stream has been resolved, or the resolution failed. See severity for an indication of which happened.
STREAM_NOTIFY_CONNECT 2 A connection with an external resource has been established.
STREAM_NOTIFY_AUTH_REQUIRED 3 Additional authorization is required to access the specified resource. Typical issued with severity level of STREAM_NOTIFY_SEVERITY_ERR.
STREAM_NOTIFY_MIME_TYPE_IS 4 The mime-type of resource has been identified, refer to message for a description of the discovered type.
STREAM_NOTIFY_FILE_SIZE_IS 5 The size of the resource has been discovered.
STREAM_NOTIFY_REDIRECTED 6 The external resource has redirected the stream to an alternate location. Refer to message .
STREAM_NOTIFY_PROGRESS 7 Indicates current progress of the stream transfer in bytes_transferred and possibly bytes_max as well.
STREAM_NOTIFY_COMPLETED 8 There is no more data available on the stream.
STREAM_NOTIFY_FAILURE 9 A generic error occurred on the stream, consult message and message_code for details.
STREAM_NOTIFY_AUTH_RESULT 10 Authorization has been completed (with or without success).
STREAM_NOTIFY_SEVERITY_INFO 0 Normal, non-error related, notification.
STREAM_NOTIFY_SEVERITY_WARN 1 Non critical error condition. Processing may continue.
STREAM_NOTIFY_SEVERITY_ERR 2 A critical error occurred. Processing cannot continue.
*/
var objContext = {
responseText : req.responseText,
responseXML : req.responseXML,
status : req.status,
statusText : req.statusText,
readyState : req.readyState,
evt : aEvt
}; // properties are not available in PHP, but offered on notification via 'this' for convenience
// notification args: notification_code, severity, message, message_code, bytes_transferred, bytes_max (all int's except string 'message')
// Need to add message, etc.
var bytes_transferred;
switch (req.readyState) {
case 0: // UNINITIALIZED open() has not been called yet.
notification.call(objContext, 0, 0, '', 0, 0, 0);
break;
case 1: // LOADING send() has not been called yet.
notification.call(objContext, 0, 0, '', 0, 0, 0);
break;
case 2: // LOADED send() has been called, and headers and status are available.
notification.call(objContext, 0, 0, '', 0, 0, 0);
break;
case 3: // INTERACTIVE Downloading; responseText holds partial data.
bytes_transferred = req.responseText.length*2; // One character is two bytes
notification.call(objContext, 7, 0, '', 0, bytes_transferred, 0);
break;
case 4: // COMPLETED The operation is complete.
if (req.status >= 200 && req.status < 400) {
bytes_transferred = req.responseText.length*2; // One character is two bytes
notification.call(objContext, 8, 0, '', req.status, bytes_transferred, 0);
}
else if (req.status === 403) { // Fix: These two are finished except for message
notification.call(objContext, 10, 2, '', req.status, 0, 0);
}
else { // Errors
notification.call(objContext, 9, 2, '', req.status, 0, 0);
}
break;
default:
throw 'Unrecognized ready state for file_get_contents()';
}
}
}
}
}
if (http_stream) {
var sendHeaders = http_options.header && http_options.header.split(/\r?\n/);
var userAgentSent = false;
for (i=0; i < sendHeaders.length; i++) {
var sendHeader = sendHeaders[i];
var breakPos = sendHeader.search(/:\s*/);
var sendHeaderName = sendHeader.substring(0, breakPos);
req.setRequestHeader(sendHeaderName, sendHeader.substring(breakPos+1));
if (sendHeaderName === 'User-Agent') {
userAgentSent = true;
}
}
if (!userAgentSent) {
var user_agent = http_options.user_agent ||
(ini.user_agent && ini.user_agent.local_value);
if (user_agent) {
req.setRequestHeader('User-Agent', user_agent);
}
}
content = http_options.content || null;
/*
// Presently unimplemented HTTP context options
var request_fulluri = http_options.request_fulluri || false; // When set to TRUE, the entire URI will be used when constructing the request. (i.e. GET http://www.example.com/path/to/file.html HTTP/1.0). While this is a non-standard request format, some proxy servers require it.
var max_redirects = http_options.max_redirects || 20; // The max number of redirects to follow. Value 1 or less means that no redirects are followed.
var protocol_version = http_options.protocol_version || 1.0; // HTTP protocol version
var timeout = http_options.timeout || (ini.default_socket_timeout && ini.default_socket_timeout.local_value); // Read timeout in seconds, specified by a float
var ignore_errors = http_options.ignore_errors || false; // Fetch the content even on failure status codes.
*/
}
if (flagNames & OPTS.FILE_TEXT) { // Overrides how encoding is treated (regardless of what is returned from the server)
var content_type = 'text/html';
if (http_options && http_options['phpjs.override']) { // Fix: Could allow for non-HTTP as well
content_type = http_options['phpjs.override']; // We use this, e.g., in gettext-related functions if character set
// overridden earlier by bind_textdomain_codeset()
}
else {
var encoding = (ini['unicode.stream_encoding'] && ini['unicode.stream_encoding'].local_value) || 'UTF-8';
if (http_options && http_options.header && (/^content-type:/im).test(http_options.header)) { // We'll assume a content-type expects its own specified encoding if present
content_type = http_options.header.match(/^content-type:\s*(.*)$/im)[1]; // We let any header encoding stand
}
if (!(/;\s*charset=/).test(content_type)) { // If no encoding
content_type += '; charset='+encoding;
}
}
req.overrideMimeType(content_type);
}
// Default is FILE_BINARY, but for binary, we apparently deviate from PHP in requiring the flag, since many if not
// most people will also want a way to have it be auto-converted into native JavaScript text instead
else if (flagNames & OPTS.FILE_BINARY) { // Trick at https://developer.mozilla.org/En/Using_XMLHttpRequest to get binary
req.overrideMimeType('text/plain; charset=x-user-defined');
// Getting an individual byte then requires:
// responseText.charCodeAt(x) & 0xFF; // throw away high-order byte (f7) where x is 0 to responseText.length-1 (see notes in our substr())
}
if (http_options && http_options['phpjs.sendAsBinary']) { // For content sent in a POST or PUT request (use with file_put_contents()?)
req.sendAsBinary(content); // In Firefox, only available FF3+
}
else {
req.send(content);
}
tmp = req.getAllResponseHeaders();
if (tmp) {
tmp = tmp.split('\n');
for (k=0; k < tmp.length; k++) {
if (func(tmp[k])) {
newTmp.push(tmp[k]);
}
}
tmp = newTmp;
for (i=0; i < tmp.length; i++) {
headers[i] = tmp[i];
}
this.$http_response_header = headers; // see http://php.net/manual/en/reserved.variables.httpresponseheader.php
}
if (offset || maxLen) {
if (maxLen) {
return req.responseText.substr(offset || 0, maxLen);
}
return req.responseText.substr(offset);
}
return req.responseText;
}
return false;
}
function get_meta_tags (file) {
// Extracts all meta tag content attributes from a file and returns an array
//
// version: 905.3122
// discuss at: http://phpjs.org/functions/get_meta_tags
// + original by: Brett Zamir (http://brett-zamir.me)
// % note 1: This function uses XmlHttpRequest and cannot retrieve resource from different domain.
// % note 1: Synchronous so may lock up browser, mainly here for study purposes.
// - depends on: file_get_contents
// * example 1: get_meta_tags('http://kevin.vanzonneveld.net/pj_test_supportfile_2.htm');
// * returns 1: {description: 'a php manual', author: 'name', keywords: 'php documentation', 'geo_position': '49.33;-86.59'}
var fulltxt = '';
if (false) {
// Use this for testing instead of the line above:
fulltxt = '<meta name="author" content="name">'+
'<meta name="keywords" content="php documentation">'+
'<meta name="DESCRIPTION" content="a php manual">'+
'<meta name="geo.position" content="49.33;-86.59">'+
'</head>';
} else {
fulltxt = this.file_get_contents(file).match(/^[\s\S]*<\/head>/i); // We have to disallow some character, so we choose a Unicode non-character
}
var patt = /<meta[^>]*?>/gim;
var patt1 = /<meta\s+.*?name\s*=\s*(['"]?)(.*?)\1\s+.*?content\s*=\s*(['"]?)(.*?)\3/gim;
var patt2 = /<meta\s+.*?content\s*=\s*(['"?])(.*?)\1\s+.*?name\s*=\s*(['"]?)(.*?)\3/gim;
var txt, match, name, arr={};
while ((txt = patt.exec(fulltxt)) !== null) {
while ((match = patt1.exec(txt)) !== null) {
name = match[2].replace(/\W/g, '_').toLowerCase();
arr[name] = match[4];
}
while ((match = patt2.exec(txt)) !== null) {
name = match[4].replace(/\W/g, '_').toLowerCase();
arr[name] = match[2];
}
}
return arr;
}
Pour plus d'information sur notre projet : [url=webteo.free.fr]vous pouvez vous rendre sur notre site ici.[url]
|
|
Cette discussion est classée dans : php, file, http, js, note
Répondre à ce message
Sujets en rapport avec ce message
Afficher du JS et PHP [ par DuncanIdaho ]
Salutje cherche a faire un script de banniere pour mon portail, mais je galere un peu...voila ce que je veux faire :Que le "client" n'ai qu'a c/c un c
CHALLENGE JS [ par Dean ]
Bonjour,Un challenge JS, ça vous tente ? J'ai trouvé ça par hasard sur le net et franchement ça vaut la peine d'essayer :http://www.espionet.com/Au pr
Probleme de paramètre JS/PHP [ par bolbo ]
Bonjour,Je cherche actuellement à créer un formulaire avec un select, les données devant y apparaitre étant extraites d'une base de données mysql.Je v
include n js/php [ par perlouis92 ]
je sui entraint de faire un system d'include en js/php (pour les page non dynamique comme le html) mais sa bug (sa marche ke sur ma page php mais pa s
PHP et JS [ par scoder ]
Bonjour, j'aurai voulu savoir comment utiliser une variable javascript en php. j'arrive à faire l'inverse mais là je ne sais pas....
requete + php dans fonction JS [ par dianouch ]
Bonjour!je veux faire 1 fonction JS de vérification de formulaire, dans laquelle je dois faire une requete SQL en php.val est une variable JS contenan
cherche js de reduction [ par MisterJAD ]
Bonjour à tous,ça fait une heure que je cherche un script, je ne trouve pas alors je demande sur le forum à tout hasard ...en fait, c'est un script ph
compatibilité JS - PHP [ par etrevilly ]
Bijours a tous, depuis ce matin je me prend la tête ac ça dans ma page fonction.js j'ai une fonction qui contient ça : document.write('') Dans ma p
[JS/PHP]Récupérer en php une variable traitée en JS ??? [ par hsmr ]
Bonjour!Je souhaite récupérer en php la variable d'une fonction JavaScript, mais je n'y arrive pasVoici le code que j'ai :<ti
pb de modifications dajout dimages [ par jotrash ]
bonjour a tous ceux qui liront ce message et mm aux autres :Voila j'arrive a ajouter une image par le biais dune prompt mais je narrive pas a linserer
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|