begin process at 2012 05 27 17:58:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caratère

 > [PHP5 - DOM - XPATH] CLASSE DE PRE-FILTRAGE DE TEXTE

[PHP5 - DOM - XPATH] CLASSE DE PRE-FILTRAGE DE TEXTE


 Information sur la source

Note :
Aucune note
Catégorie :Chaîne de caratère Classé sous :filtre, antispamm, automatique, intelligent, passif Niveau :Initié Date de création :29/01/2007 Date de mise à jour :10/02/2007 15:45:38 Vu / téléchargé :6 053 / 109

Auteur : jean84

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Cette classe calcul un pourcentage d'apparition de certains mots pre-enregistre dans une base de donnees au format xml.
Les mots sont classes par categorie et la classe permet d'en ajouter ou d'en creer de nouvelles (pas d'effacement possible pour l'instant).
On peut utiliser cette classe pour valider une reponse dans un forum par exemple en recherchant le nombre de mots present dans la categorie 'insultes' (non presente dans le code, a creer vous meme donc) ou dans la categorie 'spamm' (avec des mots genre viagra, credits, financement... j'en passe et des meilleurs).
La fonction a utiliser est la fonction Filtre::Anaylse() qui renvoi un tableau avec pour cle le nom de chaque categorie et pour valeur le pourcentage d'apparition des mots presents dans chaque categorie (je sais pas si j'ai ete clair). La validation du texte transmis sera par contre gere par vos soins.

Le code est loin d'etre parfait (pas mal de boucle foreach() ) mais le temps d'execution reste bon, pas de probleme donc logiquement pour l'integration de cette classe dans vos projets. Un tableau de code d'erreurs est disponible mais etant donne qu'il n'y a que 2 focntions (en plus du constructeur), la gestion d'erreur est un peu particuliere.
J'ai essaye de commenter le code le plus possible mais n'hesitez pas a me demander de l'aide ou des renseignements, je le ferai avec plaisir :-)

Source

  • <?php
  • /*
  • |------------|
  • | MODELE XML |
  • |------------|
  • <filtre>
  • <cat1>
  • <value>mot1</value>
  • <value>mot2</value>
  • <value>mot3</value>
  • <value>mot4</value>
  • </cat1>
  • <cat2>
  • <value>mot1</value>
  • <value>mot2</value>
  • <value>mot3</value>
  • <value>mot4</value>
  • </cat2>
  • <cat3>
  • <value>mot1</value>
  • <value>mot2</value>
  • <value>mot3</value>
  • <value>mot4</value>
  • </cat3>
  • </filtre>
  • Auteur : IoNAce (jean84)
  • Version PHP : 5
  • Lib utilise : DOM & XPATH (incluses par defaut dans php5)
  • Version classe : 1.4
  • */
  • class Filtre
  • {
  • /**********************/
  • /* Nom du fichier XML */
  • /**********************/
  • private $File;
  • /*************************/
  • /* Handle du fichier XML */
  • /*************************/
  • private $Handle;
  • /*********************************************/
  • /* Tableau d'erreurs renvoyees par la classe */
  • /*********************************************/
  • private static $TableOfErrors = array(
  • 'CANT_CREATE_XML_FILE',
  • 'CANT_LOAD_XML_FILE',
  • 'LOAD_SUCCESS',
  • 'CREATE_SUCCESS',
  • 'CANT_OPEN_FILE',
  • 'CANT_READ_FILE',
  • 'CANT_SAVE_XML_FILE',
  • 'NO_ERROR',
  • 'CANT_SEPARATE_STRING'
  • );
  • /********************************************************************************/
  • /* Rapport d'erreur de la classe */
  • /* A consulter pour connaitre le resutlat de certaines actions du constructeur */
  • /********************************************************************************/
  • public $LastError;
  • /****************************************************************/
  • /* Constructeur de la classe */
  • /* Param 1 : $sNameOfFile */
  • /* -> Nom et path du fichier xml a charger (ou a creer) */
  • /****************************************************************/
  • function __construct($NameOfFile)
  • {
  • // Creation d'un nouvel handle
  • $this->Handle = new DOMDocument('1.0', 'iso-8859-1');
  • $this->Handle->formatOutput = TRUE;
  • // Si le fichier n'existe pas, on le cree
  • if ( !file_exists((string)$NameOfFile) )
  • {
  • $HandleDoc = $this->Handle;
  • // Creation du noeud racine
  • $Racine = $HandleDoc->createElement('filtre');
  • $Racine = $HandleDoc->appendChild($Racine);
  • // On sauvegarde le fichier
  • if ( $HandleDoc->save($NameOfFile) === FALSE )
  • $this->LastError = $this->TableOfErrors[0];
  • else
  • $this->LastError = $this->TableOfErrors[3];
  • }
  • else
  • {
  • // Sinon on le charge
  • if ( !$this->Handle->load($NameOfFile) )
  • $this->LastError = $TableOfErrors[1];
  • else
  • $this->LastError = $this->TableOfErrors[2];
  • }
  • $this->File = $NameOfFile;
  • }
  • /************************************************************************************************************/
  • /* Fonction recherchant les mots de $LenWords caracteres afin de les enregistrer dans le fichier xml */
  • /* La fonction decoupe les mots grace aux espaces. Pensez donc a les inclures ! */
  • /* Param 1 : $String */
  • /* -> Chaine de caractere ou recuperer les mots */
  • /* Param 2 : $LenWords */
  • /* -> Nombre de caractere minimum par mot (si = 0, on recupere tout. Attention donc !) */
  • /* Param 3 : $Cat */
  • /* -> Nom de la categorie definissant le type de mots a enregistre */
  • /* Param 4 : $IsFile */
  • /* -> Si = TRUE, $String est le nom d'un fichier qu'il faudra lire en premier */
  • /* -> Par defaut, la valeur est mise a FALSE pour faire simple */
  • /* Attention a ne pas creer de categorie nommee 'foo' ou 'final', reserve a la classe ! */
  • /************************************************************************************************************/
  • public function SaveWords($String, $LenWords, $Cat, $IsFile=FALSE)
  • {
  • // Lecture du fichier
  • if ( $IsFile )
  • {
  • $File = fopen($String, 'r');
  • if ( $File === FALSE )
  • return $this->TableOfErrors[4];
  • $Buffer = fread($File, filesize($String));
  • if ( $Buffer === FALSE )
  • return $this->TableOfErrors[5];
  • fclose($File);
  • $String = $Buffer;
  • }
  • $Compteur = 0;
  • $Table = array();
  • $String = $this->Clean($String);
  • $SubString = explode(' ', $String);
  • if ( $SubString === FALSE )
  • return $this->TableOfErrors[8];
  • $NbrCases = count($SubString);
  • for ( $i=0; $i<$NbrCases; $i++ )
  • {
  • if ( strlen($SubString[$i]) >= $LenWords )
  • {
  • if ( !empty($SubString[$i]) )
  • {
  • $Table[$Compteur] = strtolower($SubString[$i]);
  • $Compteur += 1;
  • }
  • }
  • }
  • // Recherche de la balise <$Cat> dans le fichier xml
  • $XPath = new DOMXPath($this->Handle);
  • $Query = "boolean(/filtre/$Cat) = false";
  • $Result = $XPath->evaluate($Query);
  • $Handle = $this->Handle;
  • $Handle->formatOutput = TRUE;
  • if ( $Result === TRUE )
  • {
  • // Recupere la racine
  • $Racine = $Handle->getElementsByTagName('filtre')->item(0);
  • $Categorie = $Handle->createElement($Cat);
  • $Categorie = $Racine->appendChild($Categorie);
  • // Sauvegarde du fichier
  • if ( $Handle->save($this->File) === FALSE )
  • return $this->TableOfErrors[6];
  • }
  • // Recupere la balise <$Cat>
  • $Racine = $Handle->getElementsByTagName($Cat)->item(0);
  • // On ajoute les elements
  • foreach ( $Table as $Key => $Value )
  • {
  • $Value = soundex($Value);
  • // Verifie que le mot n'est pas deja enregistre
  • $Query = '/filtre/*/word[@value="'.$Value.'"]';
  • $Result = $XPath->query($Query);
  • if ( empty($Result->item(0)->nodeValue) )
  • {
  • $BaliseElement = $Handle->createElement('word');
  • $BaliseElement = $Racine->appendChild($BaliseElement);
  • $BaliseElement->setAttribute('value', $Value);
  • }
  • }
  • // Sauvegarde du fichier
  • if ( $Handle->save($this->File) === FALSE )
  • return $this->TableOfErrors[6];
  • else
  • return $this->TableOfErrors[7];
  • }
  • /****************************************************************************************************************************/
  • /* Cette fonction calcule (en pourcentage) le taux d'apparition de chaque mot et place le resultat dans un tableau. */
  • /* Le tableau renvoye index ses cases avec le nom des categories et le pourcentage de mots de cette catehorie comme valeur */
  • /* Param 1 : $String */
  • /* -> Texte a analyser */
  • /* Param 2 : $Cat */
  • /* -> Precise la categorie ou rechercher. Dans ce cas, le pourcentage ne sera calcule que pour cette categorie */
  • /* -> /!\ Si la categorie n'existe pas, le pourcentage sera toujours = 0 */
  • /* Dans le tableau renvoye, il y a une case speciale appellee 'foo' qui contient le nombre de mots trouvees par la fonction.*/
  • /* Permet de pouvoir apprehender le resultat final. Attention donc a ne pas creer de categorie 'foo' sous peine de voir le */
  • /* resultat errone. Une autre case appelle 'final' contient la somme de tous les pourcentages calcules jusque la. */
  • /****************************************************************************************************************************/
  • public function Analyse($String, $Cat=NULL)
  • {
  • // Preparation d'une instance de la classe DOMXPath
  • $XPath = new DOMXPath($this->Handle);
  • // Compteur de mots
  • $Comtpeur = 0;
  • // Preparation du tableau
  • $Table = array();
  • if ( $Cat === NULL )
  • {
  • $Query = '/filtre/*';
  • $Result = $XPath->query($Query);
  • foreach ( $Result as $Key => $Value )
  • $Table[$Value->nodeName] = 0;
  • }
  • else { $Table[$Cat] = 0; }
  • // Cree une case 'final' qu'on fait partir a 0
  • $Table['final'] = 0;
  • $String = $this->Clean($String);
  • // Exctraction des mots
  • $SubString = explode(' ', $String);
  • if ( $SubString === FALSE )
  • return $this->TableOfErrors[8];
  • $NbrCases = count($SubString);
  • for ( $i=0; $i<$NbrCases; $i++ )
  • {
  • if ( !empty($SubString[$i]) )
  • {
  • $SubString[$i] = soundex($SubString[$i]);
  • // On verifie que ce mot est enregistre dans une categorie (celle precise ou toutes)
  • if ( $Cat === NULL )
  • $Query = '/filtre/*/word[@value="'.$SubString[$i].'"]';
  • else
  • $Query = '/filtre/'.$Cat.'/word[@value="'.$SubString[$i].'"]';
  • $Result = $XPath->query($Query);
  • if ( !empty($Result->item(0)->nodeValue) )
  • {
  • // Si c'est le cas, on cherche les categories
  • foreach ( $Table as $Key => $Value )
  • {
  • $Query = '/filtre/'.$Key.'/word[@value="'.$SubString[$i].'"]';
  • $Result = $XPath->query($Query);
  • // Si la categorie en cours contient bien la valeur obtenue
  • if ( !empty($Result->item(0)->nodeValue) )
  • {
  • $Table[$Key] += 1;
  • break;
  • }
  • }
  • }
  • $Compteur += 1;
  • }
  • }
  • // Calcul des pourcentages
  • foreach ( $Table as $Key => $Value )
  • {
  • if ( $Key != 'final' )
  • {
  • if ( $Value != 0 )
  • $Table[$Key] = round((($Value * 100) / $Compteur), 2);
  • $Table['final'] += $Table[$Key];
  • }
  • }
  • // Cree une case 'foo' permettant a l'utilisateur de conaitre le nombre de mots pris en compte par la fonction
  • $Table['foo'] = $Compteur;
  • // Retourne le tableau
  • return $Table;
  • }
  • /************************************************/
  • /* Enleve la plupart des signes de ponctuation */
  • /* Param 1 : $Value */
  • /* -> Chaine a nettoyer */
  • /************************************************/
  • private function Clean($Table)
  • {
  • $Array = array(',', '!', ',', ';', '?', '*', '+', '-', '/', '²', '=', ')', '(', '{', '}', '"', '\'', '\\', '`', ':', ' ');
  • return str_replace($Array, '', $Table);
  • }
  • }
  • ?>
<?php
	/*
		|------------|
		| MODELE XML |
		|------------|
		
		<filtre>
			<cat1>
				<value>mot1</value>
				<value>mot2</value>
				<value>mot3</value>
				<value>mot4</value>
			</cat1>
			<cat2>
				<value>mot1</value>
				<value>mot2</value>
				<value>mot3</value>
				<value>mot4</value>
			</cat2>
			<cat3>
				<value>mot1</value>
				<value>mot2</value>
				<value>mot3</value>
				<value>mot4</value>
			</cat3>
		</filtre>		
		
		Auteur : IoNAce (jean84)
		Version PHP : 5
		Lib utilise : DOM & XPATH (incluses par defaut dans php5)
		Version classe : 1.4
	*/
	
	class Filtre
	{
		/**********************/
		/* Nom du fichier XML */
		/**********************/
		private $File;
		
		/*************************/
		/* Handle du fichier XML */
		/*************************/ 
		private $Handle;
		
		/*********************************************/
		/* Tableau d'erreurs renvoyees par la classe */
		/*********************************************/
		private static $TableOfErrors = array(
			'CANT_CREATE_XML_FILE',
			'CANT_LOAD_XML_FILE',
			'LOAD_SUCCESS',
			'CREATE_SUCCESS',
			'CANT_OPEN_FILE',
			'CANT_READ_FILE',
			'CANT_SAVE_XML_FILE',
			'NO_ERROR',
			'CANT_SEPARATE_STRING'
		);
		
		/********************************************************************************/
		/* Rapport d'erreur de la classe 												*/
		/* A consulter pour connaitre le resutlat de certaines actions du constructeur  */
		/********************************************************************************/
		public $LastError;
		 
		/****************************************************************/
		/*	Constructeur de la classe									*/
		/*	Param 1 : $sNameOfFile										*/
		/*		-> Nom et path du fichier xml a charger (ou a creer)	*/
		/****************************************************************/
		function __construct($NameOfFile)
		{
			// Creation d'un nouvel handle
			$this->Handle = new DOMDocument('1.0', 'iso-8859-1');
			$this->Handle->formatOutput = TRUE;
			
			// Si le fichier n'existe pas, on le cree
			if ( !file_exists((string)$NameOfFile) )
			{
				$HandleDoc = $this->Handle;
				
				// Creation du noeud racine 
				$Racine = $HandleDoc->createElement('filtre');
				$Racine = $HandleDoc->appendChild($Racine);
				
				// On sauvegarde le fichier 				
				if ( $HandleDoc->save($NameOfFile) === FALSE )
					$this->LastError = $this->TableOfErrors[0];
				else
					$this->LastError = $this->TableOfErrors[3];
			}
			else 
			{	
				// Sinon on le charge
				if ( !$this->Handle->load($NameOfFile) )
					$this->LastError = $TableOfErrors[1];
				else 
					$this->LastError = $this->TableOfErrors[2];
			}
			
			$this->File = $NameOfFile;
		}
		
		/************************************************************************************************************/
		/* Fonction recherchant les mots de $LenWords caracteres afin de les enregistrer dans le fichier xml 		*/
		/* La fonction decoupe les mots grace aux espaces. Pensez donc a les inclures !								*/
		/* Param 1 : $String																						*/
		/* 		-> Chaine de caractere ou recuperer les mots 														*/
		/* Param 2 : $LenWords																						*/
		/*		-> Nombre de caractere minimum par mot (si = 0, on recupere tout. Attention donc !)					*/		
		/* Param 3 : $Cat																							*/
		/*		->  Nom de la categorie definissant le type de mots a enregistre									*/
		/* Param 4 : $IsFile																						*/
		/*		-> Si = TRUE, $String est le nom d'un fichier qu'il faudra lire en premier							*/
		/*		-> Par defaut, la valeur est mise a FALSE pour faire simple											*/
		/* Attention a ne pas creer de categorie nommee 'foo' ou 'final', reserve a la classe !						*/
		/************************************************************************************************************/
		public function SaveWords($String, $LenWords, $Cat, $IsFile=FALSE)
		{
			// Lecture du fichier
			if ( $IsFile )
			{
				$File = fopen($String, 'r');
				if ( $File === FALSE )
					return $this->TableOfErrors[4];
					
				$Buffer = fread($File, filesize($String));
				if ( $Buffer === FALSE )
					return $this->TableOfErrors[5];
					
				fclose($File);
				$String = $Buffer;
			}
			
			$Compteur = 0;
			$Table = array();
			
			$String = $this->Clean($String);
			
			$SubString = explode(' ', $String);
			if ( $SubString === FALSE )
				return $this->TableOfErrors[8];
			
			$NbrCases = count($SubString);
			for ( $i=0; $i<$NbrCases; $i++ )
			{
				if ( strlen($SubString[$i]) >= $LenWords )
				{
					if ( !empty($SubString[$i]) )
					{
						$Table[$Compteur] = strtolower($SubString[$i]);
						$Compteur += 1;
					}
				}
			}

			// Recherche de la balise <$Cat> dans le fichier xml
			$XPath = new DOMXPath($this->Handle);
			$Query = "boolean(/filtre/$Cat) = false";
			$Result = $XPath->evaluate($Query);
			
			$Handle = $this->Handle;
			$Handle->formatOutput = TRUE;
			
			if ( $Result === TRUE )
			{
				// Recupere la racine
				$Racine = $Handle->getElementsByTagName('filtre')->item(0);
				$Categorie = $Handle->createElement($Cat);
				$Categorie = $Racine->appendChild($Categorie);
				
				// Sauvegarde du fichier
				if ( $Handle->save($this->File) === FALSE )
					return $this->TableOfErrors[6];
			}
			
			// Recupere la balise <$Cat>
			$Racine = $Handle->getElementsByTagName($Cat)->item(0);
			
			// On ajoute les elements
			foreach ( $Table as $Key => $Value )
			{
				$Value = soundex($Value);
				// Verifie que le mot n'est pas deja enregistre
				$Query = '/filtre/*/word[@value="'.$Value.'"]';
				$Result = $XPath->query($Query);				
				if ( empty($Result->item(0)->nodeValue) )
				{
					$BaliseElement = $Handle->createElement('word');
					$BaliseElement = $Racine->appendChild($BaliseElement);
					$BaliseElement->setAttribute('value', $Value);
				}
			}
			
			// Sauvegarde du fichier
			if ( $Handle->save($this->File) === FALSE ) 
				return $this->TableOfErrors[6];
			else
				return $this->TableOfErrors[7];
		}		
		
		/****************************************************************************************************************************/
		/* Cette fonction calcule (en pourcentage) le taux d'apparition de chaque mot et place le resultat dans un tableau. 		*/
		/* Le tableau renvoye index ses cases avec le nom des categories et le pourcentage de mots de cette catehorie comme valeur	*/
		/* Param 1 : $String																										*/
		/*		-> Texte a analyser																									*/
		/* Param 2 : $Cat																											*/
		/*		-> Precise la categorie ou rechercher. Dans ce cas, le pourcentage ne sera calcule que pour cette categorie			*/
		/*		-> /!\ Si la categorie n'existe pas, le pourcentage sera toujours = 0												*/
		/* Dans le tableau renvoye, il y a une case speciale appellee 'foo' qui contient le nombre de mots trouvees par la fonction.*/
		/* Permet de pouvoir apprehender le resultat final. Attention donc a ne pas creer de categorie 'foo' sous peine de voir le  */ 
		/* resultat errone.	Une autre case appelle 'final' contient la somme de tous les pourcentages calcules jusque la.			*/
		/****************************************************************************************************************************/		
		public function Analyse($String, $Cat=NULL)
		{
			// Preparation d'une instance de la classe DOMXPath
			$XPath = new DOMXPath($this->Handle);
			
			// Compteur de mots
			$Comtpeur = 0;
			
			// Preparation du tableau
			$Table = array();
			if ( $Cat === NULL )
			{
				$Query = '/filtre/*';
				$Result = $XPath->query($Query);
				foreach ( $Result as $Key => $Value )
					$Table[$Value->nodeName] = 0;
			}
			else { $Table[$Cat] = 0; }

			// Cree une case 'final' qu'on fait partir a 0
			$Table['final'] = 0;
			
			$String = $this->Clean($String);
			
			// Exctraction des mots
			$SubString = explode(' ', $String);
			if ( $SubString === FALSE )
				return $this->TableOfErrors[8];
			
			$NbrCases = count($SubString);
			for ( $i=0; $i<$NbrCases; $i++ )
			{
				if ( !empty($SubString[$i]) )
				{
					$SubString[$i] = soundex($SubString[$i]);
					// On verifie que ce mot est enregistre dans une categorie (celle precise ou toutes)
					if ( $Cat === NULL )
						$Query = '/filtre/*/word[@value="'.$SubString[$i].'"]';
					else
						$Query = '/filtre/'.$Cat.'/word[@value="'.$SubString[$i].'"]';
					
					$Result = $XPath->query($Query);
					if ( !empty($Result->item(0)->nodeValue) )
					{
						// Si c'est le cas, on cherche les categories
						foreach ( $Table as $Key => $Value )
						{
							$Query = '/filtre/'.$Key.'/word[@value="'.$SubString[$i].'"]';
							$Result = $XPath->query($Query);
							
							// Si la categorie en cours contient bien la valeur obtenue
							if ( !empty($Result->item(0)->nodeValue) )
							{
								$Table[$Key] += 1;
								break;
							}
						}		
					}					
					$Compteur += 1;				
				}				
			}
			
			// Calcul des pourcentages
			foreach ( $Table as $Key => $Value )
			{
				if ( $Key != 'final' )
				{
					if ( $Value != 0 )
						$Table[$Key] = round((($Value * 100) / $Compteur), 2);
						
					$Table['final'] += $Table[$Key];
				}
			}

			// Cree une case 'foo' permettant a l'utilisateur de conaitre le nombre de mots pris en compte par la fonction
			$Table['foo'] = $Compteur;
			
			// Retourne le tableau
			return $Table;
		}
		
		/************************************************/
		/* Enleve la plupart des signes de ponctuation 	*/
		/* Param 1 : $Value								*/
		/*		-> Chaine a nettoyer					*/
		/************************************************/
		private function Clean($Table)
		{
			$Array = array(',', '!', ',', ';', '?', '*', '+', '-', '/', '²', '=', ')', '(', '{', '}', '"', '\'', '\\', '`', ':', ' ');
			return str_replace($Array, '', $Table);
		}		
	}
?>

 Conclusion

Pas de bugs connus (je pense avoir fait le tour) mais pas de probleme pour les mises a jours si jamais vous en trouvez. Idem pour les fonctions a rajouter (je pense que je vais integre la possibilite d'effacer certains mots enregistres ou certaines categories, suivant les besoins).

Pour le niveau (mis en initie), j'ai fait ce choix car j'utilise XPath et DOM (de maniere simple). Que les debutants ne se frustrent pas, le code est tres accessible (de mon point de vue c'est vrai mais normalement y a pas trop de difficulte) et je reste de toute facon disponible.

En esperant que cela vous plaise :p

@++

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

29 janvier 2007 21:08:08 :
Modification du modele XML present au debut du source dans les commentaires. L'autre etait l'ancien modele, celui-ci reflete la vrai structure du document xml generee par la classe.
30 janvier 2007 17:16:30 :
Pas de mises a jour importante pour l'instant (j'ai pas encore modifier selon les conseils de Fhx) mais j'ai mis les deux versions de ma classe (avec strtok() et avec explode()), comme je l'explique plus bas.
30 janvier 2007 17:16:41 :
Pas de mises a jour importante pour l'instant (j'ai pas encore modifier selon les conseils de Fhx) mais j'ai mis les deux versions de ma classe (avec strtok() et avec explode()), comme je l'explique plus bas.
10 février 2007 15:45:39 :
- Mise a jour de la fonction Filtre::Clean() avec un traitement par tableau - Mise a jour de quelques bouts de codes par-ci par la - Ajout de la fonction soundex() afin de permettre a Filtre::Analayse() d'etre plus precise

 Sources du même auteur

CHIFFRE DE CESAR
Source avec Zip [PHP4.3.X-DOMXML]-CREATION D'UN MOTEUR DE TEMPLATE GRACE A D...
Source avec Zip [PHP5/DOM] CLASSE DE CREATION DE FLUX RSS VIA UN FICHIER XML
Source avec Zip [PHP4] MOTEUR DE TEMPLATE
Source avec Zip Source avec une capture [PHP4/MYSQL]ALBUM PHOTO + PARTIE ADMIN AVEC BDD

 Sources de la même categorie

ADRESSE ABSOLUE DE LA PAGE EN COURS, AVEC VARIABLES $_GET par Dariumis
Source avec Zip CLASSE D'OBJET DE RECHERCHE DE MOTS DANS DES TABLEAUX ET/OU ... par 8Tnerolf8
RÉCUPÉRER LES MINIATURES D'UNE VIDÉO YOUTUBE par tefa24600
Source avec Zip Source avec une capture CONVERTISSEUR DE NOMBRES EN TEXTE par macruz
Source avec Zip Source avec une capture CODAGE TEXTE >HTML, ISO, SPECIALCHARS, URL ET DECODAGE par Salva9473

 Sources en rapport avec celle ci

Source avec Zip EXÉCUTER UN SCRIPT PHP EN TANT QUE SERVICE WINDOW par ig3
Source avec Zip Source avec une capture SANYBEE GALLERY par sakini
Source avec Zip ECHANGE DE LIENS AUTOMATIQUE par maximedt
Source avec Zip Source avec une capture PHPAINT : DESSIN ET FILTRES SUR UNE IMAGE - PROTOTYPE par nonoox
Source avec Zip Source avec une capture CRÉATEUR AUTOMATIQUE DE SITE(MERCI A GUISX POUR SON SITE V3... par dydjy940

Commentaires et avis

Commentaire de jean84 le 29/01/2007 21:04:09

Bon bah j'attend vos commentaires ;-)

@++

Commentaire de FhX le 29/01/2007 21:51:29

Moi j'en ai :

private $TableOfErrors
==> dois passer statique ou constante. Au choix.

$this->File = $NameOfFile;
==> Aucune vérification à ce niveau la. (type ? est ce que c'est un fichier valable au moins ?)

if ( !file_exists($NameOfFile) )
==> Hu ? Ce test aurait du figurer plus haut dans ton code :) Après avoir tester que $NameOfFile est un type String.

#  $Result = $HandleDoc->save($NameOfFile);
# if ( $Result === FALSE )
==> Vu que tu t'en ressers pas :
if ( $HandleDoc->save($this->File) === FALSE ) { ... } else { ... }
===> J'ai même mieux :
$this->LastError = ( $HandleDoc->save($this->file) === FALSE ) ? $this->TableOfErrors[0] : $this->TableOfErrors[3];
Autant utiliser l'opérateur ternaire ici.
Pareil pour la méthode ::load().


#  $Table[$Compteur] = strtolower($Result);
# $Compteur++;
==> $table[$compteur++] = ..... ; :)

#  $Value = str_replace(',', '', $Value);
# $Value = str_replace('!', '', $Value);
# etc...

Fait un tableau avec les valeurs à modifier. Ex :
$array = array(',', '!', '?', .....);
str_replace($array, '', $ton_tableau);
return $ton_tableau.

Tu peux aussi passer la méthode en statique, vu qu'elle n'influe pas directement ta classe.

Voila entre autre :)

Commentaire de jean84 le 30/01/2007 17:12:47

Hello

private $TableOfErrors
==> dois passer statique ou constante. Au choix.

Pourquoi pas... sa peut permettre de mieux voir a quoi sert ce tableau

$this->File = $NameOfFile;
==> Aucune vérification à ce niveau la. (type ? est ce que c'est un fichier valable au moins ?)

Rejoins ce que tu as deja dit => "Hu ? Ce test aurait du figurer plus haut dans ton code :)"
Dans tout les cas, si la var n'est pas bonne, file_exists() est la pour sa. Pas la peine de verifier le type de la variable si apres il faut encore verifier si il existe. Si la var n'est aps bonne, le fichier n'existera pas. A la limite rajouter un cast histoire d'etre sur...

#  $Result = $HandleDoc->save($NameOfFile);
# if ( $Result === FALSE )
==> Vu que tu t'en ressers pas :
if ( $HandleDoc->save($this->File) === FALSE ) { ... } else { ... }
===> J'ai même mieux :
$this->LastError = ( $HandleDoc->save($this->file) === FALSE ) ? $this->TableOfErrors[0] : $this->TableOfErrors[3];
Autant utiliser l'opérateur ternaire ici.
Pareil pour la méthode ::load().

Je suis un pas un fan de l'operateur ternaire (j'ai du mal avec la syntaxe et ce n'est pas specialement rapide) mais c'est vrai que l'idee est judicieuse. Why not ? ^^


#  $Table[$Compteur] = strtolower($Result);
# $Compteur++;
==> $table[$compteur++] = ..... ; :)

J'avais deja mis a jour avec un code du type $Compteur += 1; que je prefere et de loin. Je n'aime pas trop joue avec les increments qui sont realise apres un tour de boucle, verification faite. Mais cela reste une bonne idee.

==> Fait un tableau avec les valeurs à modifier. Ex :
$array = array(',', '!', '?', .....);
str_replace($array, '', $ton_tableau);
return $ton_tableau.

Claire que c'est mieux. Je mets a jour ;-)

Pour info, j'ai modifier egalement la facon d'extraire les mots. J'utilisais jusqu'a present strtok() (je venais d'ecrire un programme en C++ et je m'en suis servis donc je l'ai garde sous le coude) mais j'avais quelque doute sur sa vitesse (boucle while plus lente qu'une for() )
J'ai donc reecrit les fonctions avec un explode() et une boucle for(). Je n'ai pas l'impression que ce soit plus rapide (temps d'execution quasi-identique), faudrait tester sur des gros fichiers. Dans le doute, je met a jour le zip avec l'ancienne et la nouvelle version. A vous de voir lequel convient mieux a vos besoins (fonctionnement strictement identique).

@++

Commentaire de malalam le 03/02/2007 12:15:01 administrateur CS

Hello,

juste pour dire que je testerai ta classe et la lirai en détail. mais je suis désolé, en ce moment, je ne trouve pas franchement le temps :-( !
Comme ta classe datetime, FhX... :-) T'as avancé ?

Jean => ce qui manquera de toutes façons à un tel code, c'est prévois les erreurs humaines : un mec peut écrire "mede" au lieu de "merde" sans faire attention (mais il voulait bien écrire merde...à moins qu'il ne voulait parler de cette charmante (sic) petite ville dans ma régione, la Mède... ;-)).
Et puis, les internautes récalcitrants s'amuseront aussi : mairde! ou merdeuh...
enfin bref, tu m'as compris... ;-)

Commentaire de jean84 le 05/02/2007 22:27:06

Malalam >
"juste pour dire que je testerai ta classe et la lirai en détail"
J'esperai vraiment que tu me dises sa, tes conseils m'on toujours ete utile ! Tiens moi au courant :p

"ce qui manquera de toutes façons à un tel code, c'est prévois les erreurs humaines [...] Et puis, les internautes récalcitrants s'amuseront aussi : mairde! ou merdeuh"
J'en ai bien conscience aussi j'ai pris soins de virer tout signes de ponctuation de chaque mot extrait. La liste est modifiable a souhait, on l'a reconnait du premier coup d'oeil ;-). J'ai voulu egalement utilise la phonetique pour pallier ce genre de probleme mais je n'ai pas eu le temps de poussees mes recherches. Je sais que mysql le gere mais je ne voulais pas utiliser une base sql. Je continuerai mes recherches un peu plus tard car j'ai pas mal de taf a la bourre mais promis je garderai l'idee jusqu'au moment venu.
Pour tous les trucs genre "merdeuh", il faut d'abord comprendre le contexte. J'ai code cette classe pour un site qui se fait constament spamme par des internautes vraiment pas tres intelligent. Des membres du site du zero pense que nous avons copie leurs sites (http://www.inzeprog.info) et nous recevions (le livre d'or a ferme) beaucoup de messages du style : bande de copieur, vous etes trop null ect...
Les messages ete globalement les memes donc une telle protection aurait ete largement suffisante. Ensuite, j'aurais beau travailer a la nasa, je ne serai jamais a l'abri de ce genre de contours et personne d'ailleurs ne le sera, il faut se l'avouer ;-)
C'est pour cela que j'ai qualifie ce code de "pre-filtrage". Il ne fera qu'informer les webmasters qu'un message est potentiellement non conforme a l'ethique. Ainsi, si jamais un developpeur code l'envoi d'un mail a chaque alerte, un modo pourra alors cibler le message et aviser en fonction.
Un travail de mise a jour de la base sera egalement necessaire afin de se conformer au mieux aux propos des internautes qui frequent un site protege par cette classe (si on peut parler de protection evidement) ainsi qu'une rigueur dans le choix des categories du fichier xml.

Donc en conclusion, je dirais que cette classe n'a pas vocation de bot virtuel et qu'elle ne remplacera jamais le travail d'un bon admin sur un forum. Elle pourra par contre etre utilise dans un webmail perso (je ne vise pas les gros sites genre laposte ou gmail, j'en suis parfaitement conscient) et peut permettre d'acceder a un certains niveau de confort a de petit developpeur voulant proposer de bons services sans chercher a devenir milliardaire ^^

C'est a peu de chose pres mon etat d'esprit quand je code et que je poste sur CS.

J'espere ne pas avoir dit trop de betises :p

@++

Commentaire de malalam le 06/02/2007 08:03:40 administrateur CS

"Donc en conclusion, je dirais que cette classe n'a pas vocation de bot virtuel et qu'elle ne remplacera jamais le travail d'un bon admin sur un forum"

OUUUUUUUUUF!! ^^

Pour le reste, je sais...je disais juste ça comme ça ;-) On ne peut pas, dans ce domaine, trouver LA parade. Pas encore en tous cas.

A propos de phonétique,
"J'ai voulu egalement utilise la phonetique pour pallier ce genre de probleme mais je n'ai pas eu le temps de poussees mes recherches",
fouille mes sources...;-)


Commentaire de jean84 le 06/02/2007 18:45:27

Alalala... j'avais raison ! Comme d'hab tu m'en apporte plus qu'il ne m'en faut... ^^

J'ai trouve tes classes et j'ai lu les topics aussi j'avais quelques questions :
- je vais coder ma propre implementation de soundex (non pas que la tienne n'est pas bonne au contraire mais je desire comprendre).
Voila ce que j'ai trouve sur php.net
Soundex()
=> http://www.php.net/manual/fr/function.soundex.php
Levenshtein()
=> http://www.php.net/manual/fr/function.levenshtein.php
Metaphone()
=> http://www.php.net/manual/fr/function.metaphone.php

Je comprend l'interet de soundex() et metaphone() mais je ne comprend pas levenshtein. L'algo mathematique me donne mal a la tronche et l'exemple ne me parle pas franchement. Tu pourrais m'expliquer STP ?

"OUUUUUUUUUF!! ^^"
J'imagine bien ton soulagement ;-)

Je crois que je vais recoder ma classe en implementant au moins la focntion soundex histoire d'etre un peu plus precis.

A bientot ;-)

Commentaire de jean84 le 10/02/2007 15:48:40

Voila alors le code a ete mis a jour.
Petit plus : la fonction Filtre::Analyse() renvoi toujours un tableau sauf que maintenant, 2 cases sont predefinies, il s'agit de 'foo' et 'final'. 'foo' est une case qui contient le nombre de mots trouves par la classe, 'final' est la somme de tous les pourcentages calcules par la classe (ce qui permet de savoir connaitre le pourcentage final de mots interdits dans une phrase sans en avoir fait le calcul)

@+

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Exécution automatique d'une tâche [ par wininfos ] Bonjour,Sur mon site, j'ai des rapports à envoyer par mail, mais je ne vais pas meconnecter tous les jours à une heure précise pour que je lance la pr envoi mail automatique [ par dargaud ] Bonjour,je suis tout nouveau en php et j'aimerai avoir un renseignement :est-il possible d'envoyer un mail automatiquement à une certaine heure tous l Mail d'avertissement automatique [ par ass ] Bonjour!Je voudrais un script qui me permet d'avertir mes clients de manière automatique un mois avent la fin de l'habonnement.Ils s'inscrivent via un redirection automatique [ par Daimadoshi ] je voudrair faire une redirection automatique e nenvoyant des valeur contenu ds des variable Detection automatique de flach [ par frespech ] qqun pourait-il m'indiquer comment faire pour detecter la presence de falsh sur le poste qui se connecte au site. destructeur automatique en php [ par 751 ] Je cherche une equivalence du destructeur Finalize() du langage Cpp en PHP.Merci d'avance.:) Execution automatique d'une page php a une heure precise [ par TiotBour ] Voila je voudrai savoir comment faire pour qu'une page php s'execute toute seule sans qu'il y est besoin de cliquer dessus (enfin 1 fois pour la lance création automatique table et champs [ par liege ] bonsoir,je cherche un code à insérer dans le fichier de récupération des données de mon formulaire pour qu'il crée automatiquement la table si elle n' Lien automatique vers une autre page. [ par jcdc ] Voilà mon soucis. Sur une page en php, je fais un test. ET j'aimerais que selon le résultat de ce test, on soit redirigé vers une autre page. Je ne pe Menu déroulant automatique ... [ par oki972 ] Bonjour je suis débutant et j'ai un gros soucis.J'ai une base de donnée qui recense des titres de livres et pour supprimer le champ correspondant a un


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales