260 lines
8.1 KiB
PHP
Executable File
260 lines
8.1 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* classe minimaliste permettant de gérer des liens internet
|
|
* on ne traite pas ici le stockage des données
|
|
*
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
class Lien
|
|
{
|
|
protected $designation; // ancre / désignation du lien.
|
|
protected $url; // adresse du lien.
|
|
public $limites=array(); // tailles limites des attributs
|
|
public $erreurs=array(); // erreurs rencontrées dans les méthodes.
|
|
/**
|
|
* Constructeur qui initialise certains attributs en testant les valeurs fournies
|
|
*
|
|
* @param infos tableau contenant les différentes données correspondant aux attributs (supposés homonymes)
|
|
* @return null
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function __construct($infos=null)
|
|
{
|
|
if((!empty($infos))&&(is_array($infos)))
|
|
{
|
|
//les limites doivent être connues avant le reste
|
|
if(!empty($infos["limites"]))
|
|
$this->limites=$infos["limites"];
|
|
unset($infos["limites"]);
|
|
$erreur_ok=false;
|
|
foreach ($infos as $attribut => $valeur)
|
|
{
|
|
$methode="set_$attribut";
|
|
if (method_exists(__CLASS__,$methode))
|
|
{
|
|
if(!$this->$methode($valeur))
|
|
$erreur_ok=true;
|
|
}
|
|
else
|
|
$this->$attribut=$valeur;
|
|
}
|
|
if(($erreur_ok)&&(empty($this->erreurs)))
|
|
$this->erreurs=(array) ERREUR_IMPREVUE;
|
|
}
|
|
}
|
|
/**
|
|
* Méthode testant la validité de la désignation du lien
|
|
* et l'attribuant à l'objet si ok
|
|
*
|
|
* @param la désignation à contrôler
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function set_designation($designation)
|
|
{
|
|
$long_min=(!empty($this->limites["designation_long_min"]))?$this->limites["designation_long_min"]:0;
|
|
if(empty($this->limites["designation_long_max"]))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$long_max=$this->limites["designation_long_max"];
|
|
if((($long_min!=0)&&(!is_int($long_min)))||(!is_int($long_max))||($long_max<$long_min))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
$designation=strip_tags(strval(trim($designation)));
|
|
$longueur=strlen($designation);
|
|
if(($longueur<$long_min)||($longueur>$long_max))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) (str_replace(array("__MIN__","__MAX__"),array($long_min,$long_max),ERREUR_LIEN_DESIGNATION_LONG)));
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
$this->designation=$designation;
|
|
return true;
|
|
}
|
|
}
|
|
/**
|
|
* Méthode testant la validité d'une url fournie
|
|
* on contrôle le format de l'url et sa longueur
|
|
* si tout est ok, on l'attribut à l'objet
|
|
*
|
|
* @param l'url à contrôler
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function set_url($url)
|
|
{
|
|
$long_min=(!empty($this->limites["url_long_min"]))?$this->limites["url_long_min"]:0;
|
|
if(empty($this->limites["url_long_max"]))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$long_max=$this->limites["url_long_max"];
|
|
if((($long_min!=0)&&(!is_int($long_min)))||(!is_int($long_max))||($long_max<$long_min))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
$url=strip_tags(strval(trim($url)));
|
|
$longueur=strlen($url);
|
|
if(($longueur<$long_min)||($longueur>$long_max))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) (str_replace(array("__MIN__","__MAX__"),array($long_min,$long_max),ERREUR_LIEN_URL_LONG)));
|
|
return false;
|
|
}
|
|
if(!filter_var($url,FILTER_VALIDATE_URL))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_LIEN_URL_FORMAT);
|
|
return false;
|
|
}
|
|
$this->url=$url;
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode retournant les entêtes d'une page internet
|
|
* permet de savoir si elle existe et si oui le type de contenu, etc.
|
|
*
|
|
* @param null
|
|
* @return tableau des entêtes, false en cas d'url de page erronée
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_entetes()
|
|
{
|
|
if(empty($this->url))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
ini_set("user_agent","Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0");//triche pour certaines restrictions d'accès...
|
|
stream_context_set_default(array("http"=>array("method"=>"HEAD"),"ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false)));//https qui font ch...
|
|
$entetes=@get_headers($this->url,1);
|
|
if(empty($entetes))
|
|
return false;
|
|
else
|
|
return $entetes;
|
|
}
|
|
/**
|
|
* Méthode tentant de récupérer le contenu situé à l'url définie
|
|
*
|
|
* @param durée limite pour récupérer le contenu
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_contenu($duree_max=0)
|
|
{
|
|
if(empty($this->url))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
if(empty($duree_max))
|
|
$duree_max=intval(ini_get("max_execution_time"));
|
|
if(!is_float($duree_max))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
ini_set("default_socket_timeout","$duree_max");
|
|
ini_set("user_agent","Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0");//triche pour les restrictions d'accès...
|
|
$contexte=stream_context_create(array("http"=>array("method"=>"GET","timeout"=>$duree_max),"ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false)));
|
|
$contexte=stream_context_create(array("http"=>array("method"=>"GET"),"ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false)));
|
|
$contenu=trim(file_get_contents($this->url,NULL,$contexte));
|
|
if(empty($contenu))//certains n'aiment pas user_agent...
|
|
{
|
|
ini_set("user_agent","");
|
|
$contenu=trim(file_get_contents($this->url,NULL,$contexte));
|
|
}
|
|
if(empty($contenu))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_LIEN_CONTENU_EXISTE);
|
|
return false;
|
|
}
|
|
return $contenu;
|
|
}
|
|
/**
|
|
* Méthode testant si le lien pointe vers un fichier html
|
|
* si oui, retourne différentes informations fournies par l'entête :
|
|
* balises title, description, link...
|
|
*
|
|
* @param null
|
|
* @return tableau contenant les résultats, false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_entete_html()
|
|
{
|
|
if(empty($this->url))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$html=$this->get_contenu(5.0);
|
|
if(empty($html))
|
|
return false;
|
|
$doc=new DOMDocument();
|
|
//libxml_use_internal_errors(true);
|
|
@$doc->loadHTML($html);
|
|
$head=$doc->getElementsByTagName('head');
|
|
if($head->length!=1)
|
|
return false;
|
|
$title=$doc->getElementsByTagName('title');
|
|
if($title->length!=0)
|
|
$resultat["title"]=affiche_utf8($title->item(0)->nodeValue,UTF8_OK);
|
|
$metas=$doc->getElementsByTagName('meta');
|
|
if ($metas->length!=0)
|
|
{
|
|
foreach ($metas as $meta)
|
|
{
|
|
if($meta->hasAttribute("name"))
|
|
{
|
|
$name=$meta->getAttribute("name");
|
|
if($meta->hasAttribute("content"))
|
|
$resultat[$name]=affiche_utf8($meta->getAttribute("content"),UTF8_OK);
|
|
}
|
|
}
|
|
}
|
|
$links=$doc->getElementsByTagName('link');
|
|
if ($links->length!=0)
|
|
{
|
|
$i=0;
|
|
foreach ($links as $link)
|
|
{
|
|
if($link->hasAttribute("href"))
|
|
$resultat["link$i"]["href"]=$link->getAttribute("href");
|
|
if($link->hasAttribute("rel"))
|
|
$resultat["link$i"]["rel"]=$link->getAttribute("rel");
|
|
if($link->hasAttribute("type"))
|
|
$resultat["link$i"]["type"]=$link->getAttribute("type");
|
|
if($link->hasAttribute("title"))
|
|
$resultat["link$i"]["title"]=affiche_utf8($link->getAttribute("title"),UTF8_OK);
|
|
$i++;
|
|
}
|
|
}
|
|
if(empty($resultat))
|
|
return false;
|
|
else
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Affichage par défaut d'un objet
|
|
*
|
|
* @return chaîne de caractères listant la valeur de chaque attribut
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function __toString()
|
|
{
|
|
$texte="<h3>".__CLASS__."</h3>";
|
|
foreach($this as $key => $value)
|
|
{
|
|
if(is_array($value))
|
|
$value=affiche_tableau($value,"<li>#valeur</li>","<ul>","</ul>");
|
|
$texte.="$key : $value\n";
|
|
}
|
|
return $texte;
|
|
}
|
|
}
|