Discussion:
Classe creer des liens internes
(trop ancien pour répondre)
Olivier Masson
2007-03-27 17:10:26 UTC
Permalink
Bonjour,

je suis à la recherche d'une classe me permettant de créer un glossaire
simple. La seule chose qui m'intéresse est la création automatique des
liens dans le contenu des articles vers les autres mots qui possèdent
également une définition.
Avez-vous qq chose à me conseiller ?

Merci.
Olivier Masson
2007-03-28 12:14:48 UTC
Permalink
Post by Olivier Masson
Bonjour,
je suis à la recherche d'une classe me permettant de créer un glossaire
simple. La seule chose qui m'intéresse est la création automatique des
liens dans le contenu des articles vers les autres mots qui possèdent
également une définition.
Avez-vous qq chose à me conseiller ?
Merci.
Bon, ok, pas de réponse, tout le monde s'en fout : je formule autrement :)

Qu'y-a-t-il de plus rapide pour remplacer dans un texte un mot par son
lien hypertexte, si ce mot existe dans la base de données (toujours dans
le cadre d'un glossaire d'une centaine de mot) ?

- Je regarde si chaque mot possède une définition dans la base

- Idem mais uniquement les mots de plus de n et moins de m lettres avec
n et m fonction du plus long et plus court mot de la base (est-ce que ça
sert à qq chose ?)

- Je regarde si chaque mot de la base est présent dans le texte.

Et si mon texte est en HTML, je fais simplement une regexp qui remplace
les tags par des espaces ?

Merci.
Thierry
2007-03-28 15:00:08 UTC
Permalink
Post by Olivier Masson
- Je regarde si chaque mot de la base est présent dans le texte.
C'est le plus rapide puisque je suppose que tu as moins de mots dans ton
glossaire que dans le texte où tu veux remplacer les mots par leurs defs.
En gros : pour chaque mot de ta base tu fais un preg replace dans le texte
du mot par son lien.
Post by Olivier Masson
Et si mon texte est en HTML, je fais simplement une regexp qui remplace
les tags par des espaces ?
Le plus chiant dans cette substition c'est de ne pas modifier des mots clé
comme par exemple le nom d'une classe CSS qui s'appellerait comme un mot a
substituer. Donc ne pas substituer ce qui est entre des <>.
Avec un peu de chance Olivier M. (l'autre) va donner la regexp qui va bien
:-)
Thief13
2007-03-28 20:37:05 UTC
Permalink
Post by Thierry
Le plus chiant dans cette substition c'est de ne pas modifier des mots clé
comme par exemple le nom d'une classe CSS qui s'appellerait comme un mot a
substituer. Donc ne pas substituer ce qui est entre des <>.
Avec un peu de chance Olivier M. (l'autre) va donner la regexp qui va bien
:-)
Personelement, je trouve que striptag() est bien mieux qu'une regexp
pour virer les tags html, mais ça n'engage que moi...
Olivier Miakinen
2007-03-28 21:56:59 UTC
Permalink
Post by Thief13
Post by Thierry
Le plus chiant dans cette substition c'est de ne pas modifier des mots clé
comme par exemple le nom d'une classe CSS qui s'appellerait comme un mot a
substituer. Donc ne pas substituer ce qui est entre des <>.
Avec un peu de chance Olivier M. (l'autre) va donner la regexp qui va bien
:-)
Personelement, je trouve que striptag() est bien mieux qu'une regexp
pour virer les tags html, mais ça n'engage que moi...
S'il s'agit de virer les tags HTML, je suis entièrement d'accord avec
toi. Mais j'avais supposé qu'Olivier cherchait au contraire à conserver
tous les tags HTML existants, se contentant de *rajouter* des éléments
<a>. Dans cette hypothèse, il me semblerait encore plus difficile de
remettre les balises après les avoir virées que de faire le changement
sans les virer.
Thief13
2007-03-29 21:54:19 UTC
Permalink
Post by Olivier Miakinen
S'il s'agit de virer les tags HTML, je suis entièrement d'accord avec
toi.
Post by Olivier Masson
Et si mon texte est en HTML, je fais simplement une regexp qui
remplace les tags par des espaces ?
Pour moi c'est clair, il semble vouloir virer les tags... Apres, j'ai
peut être mal saisi le sens...
Olivier Miakinen
2007-03-28 20:37:05 UTC
Permalink
Post by Thierry
Post by Olivier Masson
Et si mon texte est en HTML, je fais simplement une regexp qui remplace
les tags par des espaces ?
Le plus chiant dans cette substition c'est de ne pas modifier des mots clé
comme par exemple le nom d'une classe CSS qui s'appellerait comme un mot a
substituer. Donc ne pas substituer ce qui est entre des <>.
Oui, et c'est très difficile à faire. Par exemple, alors que "<" est un
caractère réservé, ">" ne l'est pas et on pourrait avoir :
<un_element value=">" class="bidule">

Pour peu que « bidule » soit un mot-clé, une regexp trop simple n'y
verra que du feu et le remplacera. Et pour une regexp plus compliquée
il ne faut pas oublier que l'on peut avoir des valeurs d'attributs
entre guillemets simples (pouvant contenir des guillemets doubles) et
d'autres entre guillemets doubles (pouvant contenir des guillemets
simples).
Post by Thierry
Avec un peu de chance Olivier M. (l'autre) va donner la regexp qui va bien
:-)
:-)

Ce serait possible à condition d'avoir des restrictions très fortes sur
le format effectif du fichier HTML. Sinon, il doit exister des fonctions
qui analysent un code HTML et en font un arbre DOM, ce qui permet de
séparer vraiment le texte des éléments HTML, mais je ne suis pas sûr que
ce soit très rapide.
Olivier Masson
2007-03-29 21:54:19 UTC
Permalink
Post by Olivier Miakinen
Oui, et c'est très difficile à faire. Par exemple, alors que "<" est un
<un_element value=">" class="bidule">
Je tiens d'abord à dire que je n'ai pas besoin de ça : c'est simplement
de la curiosité (ou cas où, un jour...)

Je n'avais pas du tout pensé à ce qu'il puisse y avoir > comme valeur
car je pensais que c'était également réservé.
Sinon, effectivement, tout le problème est dans le fait de rencontrer un
mot de la base entre <>.

J'avais pensé à une regexp simple mais j'avais surtout oublié que des
balises non fermantes existaient...
Sans parler du fait qu'il soit possible de mettre < et > dans un texte.

Bref, striptags est la meilleure idée. Pourquoi ? Parce que c'est très
rapidement que l'on saura déjà s'il y a des mots qui conviennent, bien
avant d'avoir fait une (très) lourde regexp.

Là, on peut partir sur des trucs très complexes encore. Mais le bon sens
me fait penser à un truc tout simple : regarder le mot qu'il y a avant
et après (mot ou caractère(s)) dans le texte dénudé.

Ainsi, on élimine simplement les possibilités de class et id sauf à
avoir (mais faut pas pousser, d'autant que c'est nous qui contrôlons ces
noms) des classes qui se suivent comme dans la phrase (class="la
paronomase est").

Aucune lourde regexp nécessaire. Bon, ce n'est pas tout léger non plus :)

Y voyez-vous une bourde ?
Thief13
2007-03-28 20:37:05 UTC
Permalink
- Idem mais uniquement les mots de plus de n et moins de m lettres avec n et m
fonction du plus long et plus court mot de la base (est-ce que ça sert
à qq chose ?)

à toi de nous le dire...
Et si mon texte est en HTML, je fais simplement une regexp qui remplace
les tags par des espaces ?
un strip_tags() ne serait-il pas mieux ?

En tout cas, ça m'a l'air super lourd...

bon alor, on dit que ton texte est dans $texte et que $db_connexion est
la connection à la base de donnée


function truc_chelou ($texte, $db_connexion) {

$liste_mots = explode(' ', strip_tags($texte));

foreach ($liste_mots as $clef => $mot) {

$sql = "
SELECT definition
FROM table_des_definitions
WHERE mot='".$mot."'
LIMIT 1
";

$resultat = mysql_query($sql, $db_connexion);

if (mysql_num_rows($resultat_2) == 1) {

$definition = mysql_fetch_assoc($resultat);

$liste_mots['$clef'] = '<a href="'./*Lien vers ton mot*/.'."
title="'.$definition['definition'].'"'>$mot</a>;

}

return implode(' ', $liste_mots)

}

}

Je te raconte pas le carnage pour un petit texte de 500 mots, ta base,
elle va pété un cable ^^
Olivier Masson
2007-03-29 21:54:19 UTC
Permalink
Post by Thief13
Je te raconte pas le carnage pour un petit texte de 500 mots, ta base,
elle va pété un cable ^^
En fait, c'est sur le groupe de sql que j'aurais du poster car mon
questionnement est davantage sur l'optimisation de la requête.
Je ne sais pas du tout comment fonctionne MySQL (car il est question de
ça, mais pourquoi pas Postgre).

N'y aura-t-il pas un cache du côté SQL qui ferait aller plus vite dans
un cas que dans l'autre ? Ne serait-il pas opportun de créer une base
temporaire type MEMORY uniquement avec les mots ? Etc.

Continuer la lecture sur narkive:
Loading...