OVH Cloud OVH Cloud

Mot cles dans un texte

8 réponses
Avatar
clifden
Bonjour,

J'ai la problématique suivante:
sur un page je dois faire ressortir des mots clés (qui deviendront des
liens) dans un texte.

La liste de mes mots clés est en fait une liste de lieux (sous forme de
tableau), avec le lien qui doit ammener à la fiche de ce lieu.
Je dispose pour chaque lieu d'une version transliterrée (pour l'url
rewriting), c'est à dire:
Mer Méditerrannée -> mer-mediterranee

Comment faire pour que mon texte soit analysé et que chaque mot clé y
apparaissant, ce mot soit remplacé par le lien.

J'ai pour l'instant réussi à faire le remplacement lorsque le mot y est
present de manière exacte, mais je coince, dès qu'il y a au moins une
lettre avec changement de casse, ou avec des accents qui différent, etc...

Pourriez-vous m'aider?

8 réponses

Avatar
patrice
"clifden" a écrit dans le message de
news:43905349$0$19709$
Bonjour,

Comment faire pour que mon texte soit analysé et que chaque mot clé y
apparaissant, ce mot soit remplacé par le lien.

J'ai pour l'instant réussi à faire le remplacement lorsque le mot y est
present de manière exacte, mais je coince, dès qu'il y a au moins une
lettre avec changement de casse, ou avec des accents qui différent, etc...

Pourriez-vous m'aider?


Salut faut se servir des expression régulière et d'une table d'équivalence :

equivalence :
a => Aaà
b => Bb
..
e => Eeéèê

et de remplacer par exemple "Eleve" par [Eeéèê][Ll][[Eeéèê][Vv][Eeéèê]
et de faire la recherche/substitution la-dessus.

Avatar
Kevin
Bonjour,


Salut

Pourriez-vous m'aider?


On va essayer :)

je pense que le code suivant fait ce que tu veux:

<?php

$words=array("geneve","suisse","mer mediterranee");
$crspd=array("www.geneve.ch","www.suisse.com","www.clubmed.com");

function mod_acc($c) {
return(
"@(".strtolower(str_replace(array("a","o","e","c","i","u","y","n"," "),
array("[ÀÁÂÃÄÅàáâãäåaA]","[ÒÓÔÕÖØòóôõöøoO]","[ÈÉÊËèéêëeE]","[ÇçcC]","[ÌÍÎÏìíîïiI]","[ÙÚÛÜùúûüuU]","[ÿYy]","[ÑñnN]","[t
-]"),$c)).")@i");
}

function href_me($c){
return('<a href="http://'.$c.'">1</a>');
}

$words=array_map("mod_acc",$words);
$crspd=array_map("href_me",$crspd);

$texte='Genève est une commune suisse du canton de Genève, dont elle
est le chef-lieu. C'est la deuxième plus grande ville de Suisse, avec
une agglomération de 640 000 habitants (chiffres de l'année 2000).
De plus, elle n'est pas bordée par la Mer Méditerranée...';

echo preg_replace($words,$crspd,$texte);

?>

Rien de bien compliqué en somme :)

Avatar
Olivier Miakinen
Salut !

J'arrive comme d'hab après la bataille...


function mod_acc($c) {
return(
"@(".strtolower(str_replace(array("a","o","e","c","i","u","y","n"," "),
array("[ÀÁÂÃÄÅàáâãäåaA]","[ÒÓÔÕÖØòóôõöøoO]","[ÈÉÊËèéêëeE]","[ÇçcC]","[ÌÍÎÏìíîïiI]","[ÙÚÛÜùúûüuU]","[ÿYy]","[ÑñnN]","[t
-]"),$c)).")@i");
}


1) Je suppose que c'est preg_replace au lieu de str_replace, non ?


2) Dans le preg_replace, il est inutile de remplacer une lettre par
elle-même, tu peux donc supprimer les lettres minuscules non accentuées
dans les [] :

array("[ÀÁÂÃÄÅàáâãäåA]","[ÒÓÔÕÖØòóôõöøO]","[ÈÉÊËèéêëE]","[ÇçC]","[ÌÍÎÏìíîïI]","[ÙÚÛÜùúûüU]","[ÿY]","[ÑñN]",...


3) Par ailleurs, comme tu fais un strtolower, les lettres majuscules non
accentuées ne sont pas non plus indispensables :

array("[ÀÁÂÃÄÅàáâãäå]","[ÒÓÔÕÖØòóôõöø]","[ÈÉÊËèéêë]","[Çç]","[ÌÍÎÏìíîï]","[ÙÚÛÜùúûü]","ÿ","[Ññ]",...


4) Enfin, je me demande s'il ne pourrait pas être utile de rajouter les
ligatures :

[æÆ] -> ae
ß -> ss

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Kevin

Salut !


Salut

1) Je suppose que c'est preg_replace au lieu de str_replace, non ?


Non! (ca génere des mots cléfs format regex pour le preg_replace qui
vient apres)
(g[eéè...]n[eéè...]v[eéè...]) avec ... qui correspond à tous les
caracteres accentués qui découlent de `e`



2) Dans le preg_replace, il est inutile de remplacer une lettre par
elle-même, tu peux donc supprimer les lettres minuscules non accentuées
dans les [] :


Non plus! (cf 1, sinon on pourrait pas remplacer geneve écrit sans les
accents)

3) Par ailleurs, comme tu fais un strtolower, les lettres majuscules non
accentuées ne sont pas non plus indispensables :


Là oui! (meme les majuscules accentuées)


4) Enfin, je me demande s'il ne pourrait pas être utile de rajouter les
ligatures :

[æÆ] -> ae
ß -> ss


Là c'est du chipotage mais bon pourquoi pas...

De plus ce code n'avais pas la vocation d'être une solution
définitive... elle a encore des problèmes, et des oublis (t au lieu
de t par exemple)... mais bon ça ressemble à un bon point de
départ, non?

Avatar
Olivier Miakinen

1) Je suppose que c'est preg_replace au lieu de str_replace, non ?


Non! (ca génere des mots cléfs format regex pour le preg_replace qui
vient apres)
(g[eéè...]n[eéè...]v[eéè...]) avec ... qui correspond à tous les
caracteres accentués qui découlent de `e`


Ah oui, en effet. Toutes mes excuses, je n'avais pas bien lu ton
exemple. Méthode assez sympa au demeurant.

2) Dans le preg_replace, il est inutile de remplacer une lettre par
elle-même, tu peux donc supprimer les lettres minuscules non accentuées
dans les [] :


Non plus! (cf 1, sinon on pourrait pas remplacer geneve écrit sans les
accents)


Encore d'accord. De l'intérêt de bien lire avant de répondre. ;-)

3) Par ailleurs, comme tu fais un strtolower, les lettres majuscules non
accentuées ne sont pas non plus indispensables :


Là oui! (meme les majuscules accentuées)


Pour les majuscules accentuées, c'est moins sûr :

<cit. http://fr2.php.net/manual/fr/function.strtolower.php>
Notez que la notion d'"alphabétique" est déterminée par la configuration
de localisation. Cela signifie que pour la configuration par défaut "C",
les caractères tels que les voyelles accentuées (comme é, è ou à) ne
seront pas convertis.
</cit.>

[...] ça ressemble à un bon point de départ, non?


Oui.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
clifden

?>

Rien de bien compliqué en somme :)


Merci pour ton bout de code, dont tu dis plus loin que c'est un bon
point de départ. Mais comme je suis une vraie bi... en regexp, et comme
je te l'ai dis dans le forum cousin alt.fr.comp.lang.php, j'ai eu des
problèmes avec une espèce de récurrence pour certains lieu.
Après 3h où j'ai vainement tenté de fignoler ton code qui marchait à
99%, comme je ne pouvais pas laisser en prod les 1% qui déconnait, j'ai
adopté la méthode classique mais plus bourrin de Jean Claude. Cette
méthode a le mérite que je la maitrise entièrement. De toute manière je
fais l'analyse de texte une fois, et je met en base le texte enrichi,
donc la différence de vitesse n'est presente que lorsque l'on modifie le
texte par un formulaire, donc je m'en fout.

Mais merci ton algo, il a le mérite, d'être "très joli" et certainement
plus optimum, car tu delegue le boulot au regexp ecrite en C et non à du
code PHP.

Avatar
Kevin
Mais merci ton algo, il a le mérite, d'être "très joli" et certainement
plus optimum, car tu delegue le boulot au regexp ecrite en C et non à du
code PHP.


Encore plus joli (ou bien? :p )

Puis correction du problème de double remplacement grace au assertions
"(?!.....)"


<?php
$words=array("genève" => "www.genevesuisse.ch","suisse" =>
"www.suisse.com","mer méditerranée" => "www.clubmed.com");

foreach($words as $key => $value)
{
$words_r['@('.$key.')(?![^<]*>)@si']='<a
href="http://'.$value.'">1</a>';
}

$texte='Genève est une commune suisse du canton de Genève, dont elle
est le chef-lieu. C'est la deuxième plus grande ville de Suisse, avec
une agglomération de 640 000 habitants (chiffres de l'année 2000).
De plus, elle n'est pas bordée par la Mer Méditerranée...';

echo preg_replace(array_keys($words_r),$words_r,$texte);
?>


Kevin

Avatar
Jean-Claude
"clifden" a écrit dans le message de
news: 43937eba$0$19674$

?>

Rien de bien compliqué en somme :)


Merci pour ton bout de code, dont tu dis plus loin que c'est un bon
point de départ. Mais comme je suis une vraie bi... en regexp, et comme
je te l'ai dis dans le forum cousin alt.fr.comp.lang.php, j'ai eu des
problèmes avec une espèce de récurrence pour certains lieu.
Après 3h où j'ai vainement tenté de fignoler ton code qui marchait à
99%, comme je ne pouvais pas laisser en prod les 1% qui déconnait, j'ai
adopté la méthode classique mais plus bourrin de Jean Claude. Cette
méthode a le mérite que je la maitrise entièrement. De toute manière je
fais l'analyse de texte une fois, et je met en base le texte enrichi,
donc la différence de vitesse n'est presente que lorsque l'on modifie le
texte par un formulaire, donc je m'en fout.

Mais merci ton algo, il a le mérite, d'être "très joli" et certainement
plus optimum, car tu delegue le boulot au regexp ecrite en C et non à du
code PHP.


Merci pour le bourrin ! ;-)
Jean-Claude