hellofacteurV1/modele/lien.php

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;
}
}