Merci beaucoup tisha_carpenter pour cette réponse,
J'ai cependant encore différents problèmes.
Je ne comprend pas pourquoi avec la fonction suivante, les accents des mots sont considérés comme inexistants.
// La fonction function extraire_mots($html) { $balises=implode('|',array('head','script','h[1-6]','a')); // les exclusions $regex='#<('.$balises.')[\s>].+?</\1>|</?[^>]+>|[^\w<]+#si'; $mots=preg_split($regex,$html,-1,PREG_SPLIT_NO_EMPTY); return '\''.implode('\',\'',array_unique(array_map('strtolower',$mots))).'\''; }
De plus, j'ai dans ma base de donnée des mots avec des espaces genre "webmaster hub" ou encore des mots aves des tirets genre "tisha-carpenter" et parfois avec des apostrophes "l'apéro"tout ces mots ne ressortent pas avec la requête
WHERE mot IN ('webmaster','hub','un webmaster hub','des','gros','mots','et','aussi','lien','qui','ne','doit','pas','tre','modifi','mais','ce','mot','protection','converti').
je n'arrive pas non plus à utiliser la fonction ajouter_liens à mon cas.
Pour le moment mon code est
function parser($text) { $sortie = array(); $mot = array(); $sortie = array(); $sqlquery=$xoopsDB->query("SELECT id, name from mabase ORDER LENGTH(name) DESC"); //la requête while ($sqlfetch=$xoopsDB->fetchArray($sqlquery)) { $id = $sqlfetch['id']; $name = $myts->sanitizeForDisplay($sqlfetch['name']); if (stristr($text,$name) ) { // si le mot se trouve dans le texte if (stristr($name,' ') ) {// si le mot est un mot composé $topictexturl = urlencode($name); $nameb = str_replace(" ","-", $name); //j'ai été obligé de supprimer les espaces des mots composés car j'ai aussi bien des définitions pour "webmaster" que pour "webmaster hub" (c'est un exemple) $mot[] = ('`\b(('.$name.')s?)\b`si'); $sortie[] = '<a href="id='.$id.'&mot='.$topictexturl.'">'.$nameb.'</a>'; } else {// si le mot n'est pas un mot composé $topictexturl = urlencode($name); $mot[] = ('`[^->abcdeéèfghijklmnopqrstuvwxyz](('.$name.')s?)\b`si'); $sortie[] = '<a href="id='.$id.'&mot='.$topictexturl.'">$1</a>'; } } } $text = preg_replace($mot,$sortie,$text,2); return $text; }
Pour moi mon code ne fonctionne pas bien du tout car
* je suis obligé de tester tous les mots de ma base de donnée (plus de 2000) ça fait mal à ma base à chaque fois.
* obligé de rajouter des tirets pour tous les mots composés
* je ne sais pas évité de faire des changement dans les balises (un point très important)
* et surement encore d'autres problème que je ne vois pas.
Merci d'avance
Christophe