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...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
"clifden" <clifdenn_enlever_@gmail.com.invalid> a écrit dans le message de
news:43905349$0$19709$8fcfb975@news.wanadoo.fr...
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.
"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.
$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...';
$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...';
$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 :)
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 [] :
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.)
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 [] :
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 [] :
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.)
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?
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?
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?
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.)
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.)
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.)
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.
?>
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 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.
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 "(?!.....)"
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...';
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
"(?!.....)"
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...';
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 "(?!.....)"
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...';
"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
"clifden" <clifdenn_enlever_@gmail.com.invalid> a écrit dans le message de
news: 43937eba$0$19674$8fcfb975@news.wanadoo.fr...
?>
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.
"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.