Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Faire un tri a partir d'un formulaire

18 réponses
Avatar
docanski
Bonsoir,

J'envisage de créer un outil de détermination (et donc de recherche) au
départ d'un formulaire.
Ce dernier, situé à http://mycorance.free.fr/valchamp/mycdeter.html ,
devrait aboutir par l'intermédiaire d'un script PHP (faisant le
traitement en fonction des cases cochées) d'afficher la ou les
différentes URL triées (correspondant à des pages HTML présentes sur le
site) afin de permettre leur activation par le visiteur.
C'est donc d'une fonction de tri qu'il s'agit.
Si je ne me trompe et selon ce que j'ai pu apprendre (je sais, c'est pas
grand-chose ... :-( ), il faut créer une base de données et un fichier
texte pour ce faire.
Toutefois, est-il possible d'obtenir ce résultat sans créer cette base
de données et uniquement en "balayant" la série des pages html situées
dans un dossier publié chez l'hébergeur ? En effet, partant d'un certain
nombre de mots-clefs contenus dans près de 1000 pages, créer ce fichier
texte serait un boulot plutôt long ! Alors que si cette technique de
"balayage" était réalisable, ce serait évidemment plus intéressant et
moins fastidieux ...
Le formulaire ne comporte que des "checkboxes" dont les "value"
contiennent les mots-clés et le principe est de faire un tri résultant
de l'addition de toutes les options cochées.
Avec la possibilité pour le visiteur de n'en cocher qu'une partie sans
pour autant bloquer l'action du script, bien entendu.
J'espère me faire bien comprendre ...
Quelles sont les options possibles ?
--
docanski

- Les Côtes du nord de la Bretagne par le sentier des douaniers
- Memento des champignons : le guide le plus complet du Web
- Et d'autres sujets encore sur ----> http://armorance.free.fr

10 réponses

1 2
Avatar
P'tit Marcel
J'envisage de créer un outil de détermination (et donc de recherche) au
départ d'un formulaire.
Ce dernier, situé à http://mycorance.free.fr/valchamp/mycdeter.html ,
devrait aboutir par l'intermédiaire d'un script PHP (faisant le
traitement en fonction des cases cochées) d'afficher la ou les
différentes URL triées (correspondant à des pages HTML présentes sur le
site) afin de permettre leur activation par le visiteur.
C'est donc d'une fonction de tri qu'il s'agit.


Apparemment, il s'agit plutôt d'une sélection que d'un tri.


Toutefois, est-il possible d'obtenir ce résultat sans créer cette base
de données et uniquement en "balayant" la série des pages html situées
dans un dossier publié chez l'hébergeur ? En effet, partant d'un certain
nombre de mots-clefs contenus dans près de 1000 pages, créer ce fichier
texte serait un boulot plutôt long !


C'est difficile de répondre sans précision sur la logique qui permet de
passer des critères du formulaire vers les pages à sélectionner. Est-ce
que le nom d'une page reprend les valeurs de critère ? Ou est-ce que ces
valeurs sont dans des balises motclé html (<Meta name="keywords"...) ?


Bon champignon,
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/

Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
P'tit Marcel nous narre ce qui suit en ce 30/04/2007 22:17 :

Apparemment, il s'agit plutôt d'une sélection que d'un tri.


Si tu veux. Il s'agit, à partir d'un certain nombre d'options chosies
par le visiteur, d'utiliser la totalité des mots-clefs qui correspondent
à ces options afin de les comparer aux fiches existantes.

C'est difficile de répondre sans précision sur la logique qui permet de
passer des critères du formulaire vers les pages à sélectionner. Est-ce
que le nom d'une page reprend les valeurs de critère ? Ou est-ce que ces
valeurs sont dans des balises motclé html (<Meta name="keywords"...) ?


Les mots-clefs se trouvent dans le texte des pages HTML et non dans une
meta. La recher devrait donc consister à "balayer" chacune des fiches
afin d'y retrouver les mots-clef et, si la totalité de ceux choisis
correspondant, d'afficher l'URL (les URL) correspondantes. Si tu veux
avoir un exemple, choisis n'importe quelle fiche à partir de cette page
: http://mycorance.free.fr/valchamp/alfa.htm

Bon champignon,
;-)


Cordialement
--
docanski

- Les Côtes du nord de la Bretagne par le sentier des douaniers
- Memento des champignons : le guide le plus complet du Web
- Et d'autres sujets encore sur ----> http://armorance.free.fr

Avatar
P'tit Marcel
Apparemment, il s'agit plutôt d'une sélection que d'un tri.


Si tu veux. Il s'agit, à partir d'un certain nombre d'options chosies
par le visiteur, d'utiliser la totalité des mots-clefs qui correspondent
à ces options afin de les comparer aux fiches existantes.


Tri : e t y u o p => e o p t u t
Sélection : e t y u o p => y o u

La sélection extrait une partie d'un ensemble
Le tri conserve l'ensemble mais l'ordonne



C'est difficile de répondre sans précision sur la logique qui permet
de passer des critères du formulaire vers les pages à sélectionner.
Est-ce que le nom d'une page reprend les valeurs de critère ? Ou
est-ce que ces valeurs sont dans des balises motclé html (<Meta
name="keywords"...) ?


Les mots-clefs se trouvent dans le texte des pages HTML et non dans une
meta. La recher devrait donc consister à "balayer" chacune des fiches
afin d'y retrouver les mots-clef et, si la totalité de ceux choisis
correspondant, d'afficher l'URL (les URL) correspondantes.


Ton problème aujourd'hui est d'abord de créer des règles de
correspondance entre les mots clés choisis dans ton formulaire et le
texte des pages détail. Dans un second temps, tu choisiras s'il vaut
mieux utiliser une BDD, un fichier texte ou balayer des balises keywords
dans les pages HTML.


Pour extraire les mots clés présents dans les pages HTML, il faut faire
des analyses des pages à coup de regex un peu complexes. Voici un script
qui fonctionne :

<?php

$categories array('Chapeau', 'Lames', ..., 'Famille', 'Nom scientifique');

$rep = opendir('.');
if(!$rep) die('impossible de lire le répertoire');

while (($fichier = readdir($rep)) !== false) {
if(preg_match('`.html?$`i', $fichier)) {
foreach($categories as $categorie) {
echo "<h2>$fichier: $categorie</h2>n<PRE>";
$r = cherche_motcles($fichier, $categorie, $motscles);
if(!$r[0])
echo $r[1];
else {
print_r($motscles);
}
echo "</PRE>n";
}
}
}
closedir($rep);

function cherche_motcles($page_html, $categorie, &$motscles) {

# pour une bonne gestion des accents
setlocale(LC_ALL, 'fr_FR');

# lire la page HTML
$page = @file_get_contents($page_html);
if(!$page) return(array(false, "page $page_html non trouvée"));

# extraire la partie descr
$masque = '`<divsid="descr">(.*)</div>`iUs';
$ok = preg_match($masque, $page, $match);
if(!$ok) return(array(false,
"partie descr non trouvée dans $page_html:n$page"));

# retirer les balises HTML sauf les paragraphes
$descr = strip_tags($match[1], '<p>');

# rechercher le paragraphe relatif à la catégorie
$masque = '`<p>s*'.trim($categorie).'s*:(.*)</p>`iUs';
$ok = preg_match($masque, $descr, $match);
if(!$ok) return(array(false,
"paragraphe $categorie non trouvé dans $page_html"));
$texte_categorie = $match[1];

# retirer les petits mots de un ou deux caractères
$masque = '`bw{1,2}b`';
$texte_categorie = preg_replace($masque, '', $texte_categorie);

# éclater le texte en mots
$masque = '`[-s.,;:/!?=+*"'()]`';
$motscles preg_split($masque, $texte_categorie, -1, PREG_SPLIT_NO_EMPTY);

# suprimmer les doublons
$motscles = array_unique($motscles);

# retourner les mots-clés
return(array(true, 'ok'));

}
?>

Une fois que tu as ça, tu peux te préoccuper de l'endroit où stocker le
résultat. Le plus simple est de remplacer le print_r par une instruction
MySQL pour stocker ces mots clés dans une table. Mais ceci est une autre
histoire !

à l'avenir, quand tu crées tes pages HTML, pense à l'usage que tu veux
en faire. Ici, les mots-clés résumant chaque champignon auraient dû être
isolés du texte visible (par exemple, dans des balises META keyword) ce
qui permet ensuite de les exploiter par programme sans souci.


a+
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/


Avatar
Fredchou
Ce dernier, situé à http://mycorance.free.fr/valchamp/mycdeter.html ,
devrait aboutir par l'intermédiaire d'un script PHP (faisant le
traitement en fonction des cases cochées) d'afficher la ou les
différentes URL triées (correspondant à des pages HTML présentes sur le
site) afin de permettre leur activation par le visiteur.
[...]
Toutefois, est-il possible d'obtenir ce résultat sans créer cette base
de données et uniquement en "balayant" la série des pages html situées
dans un dossier publié chez l'hébergeur ? En effet, partant d'un certain
nombre de mots-clefs contenus dans près de 1000 pages, créer ce fichier
texte serait un boulot plutôt long ! Alors que si cette technique de
"balayage" était réalisable, ce serait évidemment plus intéressant et
moins fastidieux ...


Il me semble qu'il existe des outils (moteurs de recherche) qui font ça très
bien. D'autres membres de ce groupe pourront probablement t'orienter vers de
tels outils.

Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
P'tit Marcel nous narre ce qui suit en ce 1/05/2007 14:54 :

Tri : e t y u o p => e o p t u t
Sélection : e t y u o p => y o u


Pas bien compris, là :-(

Je dirais ainsi, en simplifiant et en limitant arbitrairement le nombre
d'options choisies :
- 5 options sont choisies dans le formulaire : abc, def, ghi, klm, nop,
par exemple
- ces options trouvent leur traduction (qui sont parfois 1, 2, 3 ou 4
mots-clefs) dans les valeurs reprises dans "value" du formulaire
- le script cherche dans le texte des 1000 fiches HTML si la *totalité*
de ces 5 options (qui peuvent donc totaliser 10 ou 20 mots-clefs) s'y
trouve
- il termine en affichant les URL des fiches comportant
*indispensablement* les mots-clefs de ces 5 options
- ainsi, toutes les fiches contenant abc, def, ghi, klm, nop pourront
être consultables par le visiteur

Ton problème aujourd'hui est d'abord de créer des règles de
correspondance entre les mots clés choisis dans ton formulaire et le
texte des pages détail.


La correspondance se traduit actuellement par la présence de mots (ou
plus rarement de préfixes "allongés") équivalents d'une part dans le
formulaire et d'autre part dans les fiches.

Dans un second temps, tu choisiras s'il vaut
mieux utiliser une BDD, un fichier texte ou balayer des balises keywords
dans les pages HTML.


Ce qui voudrait dire qu'en l'état, le traitement du formulaire serait
trop long, si je comprends bien.
Et qu'il faudrait soit remanier toutes les pages, soit créer un fichier
texte (il risque d'être très lourd, vu le nombre !) ... ou utiliser une
BDD. Ne m'étant jamais attaché à l'étude de cette notion, j'ignore même
de quoi elle peut être faite :-( mébon, il va sans doute falloir que je
m'y attèle.

Pour extraire les mots clés présents dans les pages HTML, il faut faire
des analyses des pages à coup de regex un peu complexes. Voici un script
qui fonctionne :


Ta disponibilité et ta volonté d'aider me confondent !
Je vais faire quelques essais ... et avant tout tenter de comprendre un
peu le cheminement de cette sélection.

Une fois que tu as ça, tu peux te préoccuper de l'endroit où stocker le
résultat. Le plus simple est de remplacer le print_r par une instruction
MySQL pour stocker ces mots clés dans une table. Mais ceci est une autre
histoire !


Je reviendrai ! ;-)

à l'avenir, quand tu crées tes pages HTML, pense à l'usage que tu veux
en faire. Ici, les mots-clés résumant chaque champignon auraient dû être
isolés du texte visible (par exemple, dans des balises META keyword) ce
qui permet ensuite de les exploiter par programme sans souci.


Voui. Le problème est qu'un petit projet peut parfois devenir un gros
machin et qu'au départ un formulaire de recherches ou une clef de
détermination ne se justifie pas. Celui-ci a vu le jour en 1999 et il
n'était pas prévu un tel développement ! Aujourd'hui, il est devenu le
guide le plus complet du web dans cette matière ... du moins en français.

Un grand merci !
Cordialement,
--
docanski

- Les Côtes du nord de la Bretagne par le sentier des douaniers
- Memento des champignons : le guide le plus complet du Web
- Et d'autres sujets encore sur ----> http://armorance.free.fr

Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
P'tit Marcel nous narre ce qui suit en ce 1/05/2007 14:54 :

<?php

$categories > array('Chapeau', 'Lames', ..., 'Famille', 'Nom scientifique');
... etc.

}
?>


Il y a un hic dont je n'arrive pas à trouver l'origine : lancé dans le
répertoire principal (contenant la totalité des fiches), le script
affiche la *totalité* du contenu des différentes rubriques (dont
certains titres sont visibles ci-dessus) de *toutes* les fiches présentes.
Il n'y a donc pas de tri à partir des mots-clefs choisis mais une
extraction et un affichage de la totalité du texte. :-(
Par ailleurs, il me semble inutile de faire la sélection en tenant
compte des rubriques mais d'extraire les URL correspondantes en faisant
cette sélection sur la totalité du texte, balises HTML exclues, bien
entendu.
L'affichage du contenu de ces rubriques n'est d'ailleurs pas le but
recherché mais uniquement celui des URL, sous forme de liens directement
utilisables.
Mais je demande peut-être l'impossible ... ?

Cordialement,
--
docanski

- Les Côtes du nord de la Bretagne par le sentier des douaniers
- Memento des champignons : le guide le plus complet du Web
- Et d'autres sujets encore sur ----> http://armorance.free.fr

Avatar
P'tit Marcel
Il y a un hic dont je n'arrive pas à trouver l'origine : lancé dans le
répertoire principal (contenant la totalité des fiches), le script
affiche la *totalité* du contenu des différentes rubriques (dont
certains titres sont visibles ci-dessus) de *toutes* les fiches présentes.


c'est pas un hic, c'est ce que le programme est censé faire. à partir de
cet algorithme, tu peux construire une table de concordance entre les
mots-clés et les champignons.

En pratique, il suffit de remplacer le print_r par une insertion dans
une table de concordance, du genre :

$sql0 = "replace motcle(page, categorie, mot) values('$fichier',
'$categorie', '";
foreach($motscles as $motcle) {
$sql = $sql0 . addslashes($motcle) . "')";
mysql_query($sql) or die("erreur sql<br/>$sql<br/>".mysql_error());
}


Par la suite, tu pourras exploiter cette table dans le script appelé par
ton formulaire. Par exemple l'utilisateur précise pied cylindrique et
chapeau rond, etc.. Le script appelé récupèrera les pages correspondant
à cette description par un:

$cond = array();
$cond[] = "(categorie = 'Pied' and mot = 'cylindrique')";
$cond[] = "(categorie = 'Chapeau' and mot in ('ovoïde', 'sphérique',
'globuleux'))";
...(autres conditions)...

$sql = "select distinct page from motcle where " .
implode(" and ", $cond) . " order by page";
$res = mysql_query($sql);
if(!$res) die("erreur sql<br/>$sql<br/>".mysql_error());
if(mysql_num_rows($res)==0) {
echo "aucune page ne répond à ces critères";
}
else {
echo"Liste des pages répondant à ces critères:<br/>";
while($ligne=mysql_fetch_assoc($res)) {
echo $row['page'], "<br/>";
}
}


au préalable, tu auras créé la table vide dans la base de données avec
une commande :
create table motcle(
page varchar(50) not null default '',
categorie varchar(50) not null default '',
mot varchar(50) not null default '',
primary key(page, categorie, mot)
)
(mais là je suis carrément hors charte de ce forum sur php)


Par ailleurs, il me semble inutile de faire la sélection en tenant
compte des rubriques mais d'extraire les URL correspondantes en faisant
cette sélection sur la totalité du texte, balises HTML exclues, bien
entendu.


Dans ce cas, il te suffit de virer les lignes qui exploitent la variable
$categorie. Je crois cependant que ce serait une erreur car tu mettrais
alors dans le même sac par exemple la couleur du pied et la couleur du
chapeau.


a+
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/

Avatar
Anthony
Quelles sont les options possibles ?


je pense qu'il faut voir le truc autrement.
- un script (A) qui "parse" l'ensemble des pages et balance les infos
clés dans une bd.
- le formulaire permet l'interrogation de la base sur les critères
choisis a partir d'un script (B)

mieux vaut lancer le script (A) a chaque modification / ajout de pages

plutôt que de parser l'ensemble des fichiers à chaque interrogation du
formulaire.

bien cordialement,

Anthony

Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
Anthony nous narre ce qui suit en ce 7/05/2007 14:38 :

je pense qu'il faut voir le truc autrement.
- un script (A) qui "parse" ...
- le formulaire permet l'interrogation ... partir d'un script (B)


C'est ce qu'il me semble avoir conclu de mon échange avec P'tit Marcel.

mieux vaut lancer le script (A) a chaque modification / ajout de pages


Une mise à jour de la BDD, si je comprends bien.

Donc au moins 2 scripts (le premier étant celui donné par P'tit Marcel
et le second ... à créer) pour obtenir le résultat voulu ... ou un
troisième encore pour afficher les URL's correspondant à la sélection
des part.1 et part.2 ?

bien cordialement,


Tout autant,
--
docanski

- Les Côtes du nord de la Bretagne par le sentier des douaniers
- Memento des champignons : le guide le plus complet du Web
- Et d'autres sujets encore sur ----> http://armorance.free.fr

Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
P'tit Marcel nous narre ce qui suit en ce 7/05/2007 10:53 :

c'est pas un hic, c'est ce que le programme est censé faire. à partir de
cet algorithme, tu peux construire une table de concordance entre les
mots-clés et les champignons.


Si je comprends bien, il est nécessaire d'utiliser une base de données
créée au préalable pour faire une sélection par le résultat du
formulaire qui ira l'interroger. Ensuite, il faudra évidemment mettre le
résultat de cette sélection en musique en créant une page affichant les
URL's puisque tel est le résultat recherché. 3 étapes, en somme.
Bien compliqué pour moi dans une situation de méconnaissance totale du
langage :-(
Ton premier script ne servirait donc *que* pour créer au préalable la
base de données pour qu'elle soit stockée sur le serveur ?
Sinon, cela signifierait que chaque recherche enclenchée par la
validation du formulaire irait d'abord extraire le contenu des
catégories, les inscrirait provisoirement (je suppose ...) dans une base
de données pour ensuite en sélectionner les mots-clefs correspondant à
la demande ? Si c'est le cas, je crains que cette recherche soit trop
longue (1000 fiches, c'est beaucoup). Il serait donc préférable de créer
directement une base de données et se "contenter" d'utiliser un script
uniquement pour la sélection puis la réponse avec affichage des URL's.
J'ai bon ?
Si c'est nécessaire, je ferais bien la première partie (quoique je ne
sais même pas comment créer une table : va falloir que je potasse), puis
restera à réaliser ce script ...
Suis pas sorti de l'auberge :-(
(d'autant que je me demande si j'ai été clair dans ce qui précède ...)

En pratique, il suffit ...


Si ça pouvait être vrai (qu'il suffise) ... ;-)

au préalable, tu auras créé la table vide dans la base de données avec
une commande :
...

(mais là je suis carrément hors charte de ce forum sur php)


Ah ? La création de bases de données n'est pas du même domaine ?

Dans ce cas, il te suffit de virer les lignes qui exploitent la variable
$categorie. Je crois cependant que ce serait une erreur car tu mettrais
alors dans le même sac par exemple la couleur du pied et la couleur du
chapeau.


Ok. Ça, au moins, je le retiendrai !
Merci pour ta patience et tes qualités pédagogiques. Je suis toutefois
déjà largué et je mesure le gouffre que j'ai à combler avant d'arriver à
mes fins.
Je vais commencer par tenter de comprendre le cheminement du procédé (si
c'est bien celui que j'évoque plus haut) car pour ce qui est de suivre
tes conseils dans la pratique, ça reste fort brumeux pour le moment.

Cordialement,
--
docanski

- Les Côtes du nord de la Bretagne par le sentier des douaniers
- Memento des champignons : le guide le plus complet du Web
- Et d'autres sujets encore sur ----> http://armorance.free.fr

1 2