Detection + remplacement de mots, conseil d'optimisation
Posté : 31 mars 2009, 23:22
Bonsoir,
Je suis en train de créer une classe qui permet de détecter des mots dans une chaine pour les remplacer par un lien HTML.
Çà va me servir à faire un glossaire, et à pouvoir générer des liens automatique vers les définitions à la volée sur des textes.
L'idée va être de stocker dans un fichier texte les mots à détecter.
Ensuite j'ai un explode de ma chaine et une reconstruction de celle-ci avec comparaison des valeurs avec les mots de mon glossaire, avant d'y coller un lien, pour ensuite afficher le tout... ouf rien que ça !
Seulement je pense que je vais avoir un gros hic lorsque j'aurais des textes importants et un gros fichier de mots. Avec pas moins de 3 foreach au total dans ma classe, je pense qu'il y a du travail sur l'optimisation.
Si vous avez des idées
:
Je suis en train de créer une classe qui permet de détecter des mots dans une chaine pour les remplacer par un lien HTML.
Çà va me servir à faire un glossaire, et à pouvoir générer des liens automatique vers les définitions à la volée sur des textes.
L'idée va être de stocker dans un fichier texte les mots à détecter.
Ensuite j'ai un explode de ma chaine et une reconstruction de celle-ci avec comparaison des valeurs avec les mots de mon glossaire, avant d'y coller un lien, pour ensuite afficher le tout... ouf rien que ça !
Seulement je pense que je vais avoir un gros hic lorsque j'aurais des textes importants et un gros fichier de mots. Avec pas moins de 3 foreach au total dans ma classe, je pense qu'il y a du travail sur l'optimisation.
Si vous avez des idées
<?php
class detecterMotGlossaire{
public $inputString;
public $outputString;
private $listeMotGlossaire;
private $motDetecte;
public function __construct($inputString=null){
$this->inputString = $inputString;
$this->outputString = null;
$this->listeMotGlossaire = array('article', 'un');
$this->motDetecte = array();
}
public function generer($url){
$temp = $this->detecter();
return $this->output($temp, $url);
}
private function detecter(){
$temp = explode(' ', $this->inputString);
foreach($temp as $k=>$mot){
foreach($this->listeMotGlossaire as $motGlosaire){
if($mot == $motGlosaire){ // cas simple
$this->motDetecte[$k] = $mot;
}
elseif(preg_match('#'.$motGlosaire.'(,|.|;|:){1}$#', $mot, $matches)){ // cas : mot,
$this->motDetecte[$k] = str_replace($matches[1], null, $mot);
}
elseif(preg_match('#((.*){1}(\'))'.$motGlosaire.'#', $mot, $matches)){ // cas : mot,
$this->motDetecte[$k] = str_replace($matches[1], null, $mot);
}
}
}
return $temp;
}
private function output($temp, $url){
foreach($temp as $k=>$mot){
if(array_key_exists($k, $this->motDetecte)){
$finalString.= '<a href="'.$url.$this->convertWordForUrl($this->motDetecte[$k]).'">'.$mot.'</a>';
}
else{
$finalString.= $mot;
}
$finalString.= ' ';
}
return $finalString;
}
private function convertWordForUrl($string)
{
$replace = array(
' '=>'-',
'ŕ'=>'a',
'á'=>'a',
'â'=>'a',
'ă'=>'a',
'ä'=>'a',
'ĺ'=>'a',
'ň'=>'o',
'ó'=>'o',
'ô'=>'o',
'ő'=>'o',
'ö'=>'o',
'č'=>'e',
'é'=>'e',
'ę'=>'e',
'ë'=>'e',
'ě'=>'i',
'í'=>'i',
'î'=>'i',
'ď'=>'i',
'ů'=>'u',
'ú'=>'u',
'ű'=>'u',
'ü'=>'u',
'˙'=>'y',
'ń'=>'n',
'ç'=>'c',
'ř'=>'0'
);
return strtr(strtolower($string), $replace);
}
}
$chaine = new detecterMotGlossaire("Dans cet article, nous allons voir comment configurer le host pour développer un site en local. Notre but est de transférer un site d'un serveur local sur un serveur distant (votre hébergeur par exemple) sans avoir ŕ...");
echo($chaine->generer('glossaire.php?mot='));
?>