IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Cherche à développer un outil d'aide au scrabble


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Par défaut Cherche à développer un outil d'aide au scrabble
    Bonjour,

    Je suis en train de développer un petit script d'aide au scrabble, ce script se présente sous la forme d'un petit formulaire dans lequel on défini le nombre de lettres que doit comporter le mot que l'on choisi, l'ensemble des lettres possibles et les lettres sont on veut pas, ce formulaire se base sur un dictionnaire de mots et une fois qu'on a tout rempli, ça nous donne une liste.

    Voici la page sur laquelle le formulaire est en fonctionnement mais qui ne fonctionne pas :
    https://thierrychabenat.fr/scrabble/formulaire.html

    Le
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="utf-8">
      <title>Formulaire de recherche de mots</title>
    </head>
    <body>
      <form id="monFormulaire" action="recherche.php" method="post" enctype="multipart/form-data">
        <label for="nombre">Nombre de lettres</label>
        <input type="number" id="nombre" name="nombre" min="1">
        <label for="possibles">Lettres possibles</label>
        <input type="text" id="possibles" name="possibles" value="abcdefghijklmnopqrstuvwxyz">
        <label for="impossibles">Lettres impossibles</label>
        <input type="text" id="impossibles" name="impossibles">
        <input type="file" id="fichier" name="fichier">
        <input type="submit" value="Rechercher">
      </form>
      <div id="resultats"></div>
    </body>
    </html>

    Le
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $nombre = $_POST["nombre"];
      $possibles = strtolower($_POST["possibles"]);
      $impossibles = strtolower($_POST["impossibles"]);
     
      $mots = [];
     
      if (isset($_FILES["fichier"]) && $_FILES["fichier"]["error"] == 0) {
        $fichier = $_FILES["fichier"]["tmp_name"];
        $destination = "/path/to/destination";
        move_uploaded_file($fichier, $destination);
     
      $fichier = "../scrabble/dictionnaire.txt";
        $contenu = file_get_contents($fichier);
        $lignes = explode("\n", $contenu);
     
        foreach ($lignes as $ligne) {
          $mot = trim($ligne);
     
          if (mb_strlen($mot) == $nombre && !preg_match("/[zZ]/", $mot) && preg_match("/^[$possibles]*$/u", $mot)) {
            $mots[] = $mot;
          }
        }
     
        if (!empty($mots)) {
          echo "Résultats :<br>";
          foreach ($mots as $mot) {
            echo "$mot<br>";
          }
        } else {
          echo "Aucun mot correspondant aux critères trouvés.";
        }
      } else {
        echo "Veuillez sélectionner un fichier.";
      }
    }
     
    ?>

    Comme vous pouvez le constater, ça ne fonctionne pas et j'ai beau m'arracher les cheveux, je ne comprends pas pourquoi, auriez-vous une idée sur la question ?

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 020
    Par défaut
    Vérifie les valeurs de upload_max_filesize et post_max_size dans ton php.ini. Vérifie aussi que tu as les droits nécessaires pour accéder au répertoire tmp (0777) et à celui de destination.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Les répertoires ne correspondent pas, est-ce que c'est normal?
    $destination = "/path/to/destination";     // <--
    move_uploaded_file($fichier, $destination);
     
    $fichier = "../scrabble/dictionnaire.txt"; // <--
    Quelque soit l'origine du problème, isole le pour le résoudre (fait un simple formulaire de téléchargement de fichier sans rien d'autre et regarde ce qui se passe).

    Quelques remarques:
    • Pourquoi charger un dictionnaire à chaque fois? À à ma connaissance il n'y a pas 150 dictionnaires de scrabble, et ce serait plus simple de mettre le fichier une fois pour toute sur ton serveur, et encore mieux de placer les mots dans une base de données. (Pour info, mon fichier dictionnaire de scrabble français fait environ 4.2 Mo pour 378989 entrées toutes en majuscules séparées par \n).
    • Au scrabble, les accents, cédilles et la casse ne sont pas pris en compte. Ça vaut aussi bien pour le contenu du dictionnaire que pour l'entrée utilisateur. Partant de ce principe, tu t'épargnerais la variante multibyte de strlen et le modificateur u dans la regex qui ne vont pas accélérer les choses.
    • Elle t'a fait quoi la lettre Z?
    • Il y a plus simple que de faire successivement un file_get_contents, un explode, un foreach, un trim puis un filtrage selon conditions, c'est d'utiliser l'instruction file avec l'option FILE_IGNORE_NEW_LINES et d'utiliser array_filter. Néanmoins, procéder de cette manière t'oblige à charger tout le fichier dans un tableau, ce qui représente un bon gros tableau qui occupe pas mal de mémoire pour un fichier de 378989 entrées. L'alternative serait de le lire ligne par ligne (avec stream_get_contents) en ne retenant que celles qui correspondent aux critères. Le plus performant reste l'utilisation d'une base de données.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Par défaut
    J'ai revu mon code, ça a l'air de mieux fonctionner, j'ai modifié mon dictionnaire en supprimant tous les caractères superflus pour ne laisser que les mots.
    Je t'avouerai que suis nul à chier en code, après, je suis d'accord qu'avec une base de donnée, ça serait mieux mais ça complexifie les choses, je maîtrise pas du tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $nombre = $_POST["nombre"];
      $possibles = strtolower($_POST["possibles"]);
      $impossibles = strtolower($_POST["impossibles"]);
     
      $mots = [];
     
      if (isset($_FILES["fichier"]) && $_FILES["fichier"]["error"] == 0) {
        $fichier = $_FILES["fichier"]["tmp_name"];
     
        // Ouvre le fichier en lecture
        $handle = fopen($fichier, "r");
     
        if ($handle) {
          while (($mot = fgets($handle)) !== false) {
            $mot = trim($mot);
     
            // Vérifie les critères
           if (strlen($mot) == $nombre && !strpbrk($mot, $impossibles) && strpbrk($mot, $possibles) !== false) {
        $mots[] = $mot;
    }
     
          }
     
          fclose($handle);
        }
     
        if (!empty($mots)) {
          echo "Résultats :<br>";
          foreach ($mots as $mot) {
            echo "$mot<br>";
          }
        } else {
          echo "Aucun mot correspondant aux critères trouvés.";
        }
      } else {
        echo "Veuillez sélectionner un fichier.";
      }
    }
    ?>

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 020
    Par défaut
    Content de voir que ça fonctionne, mais une fois encore, pourquoi est-ce que tu t'embêtes à uploader ton dictionnaire avec ton formulaire, place ton dictionnaire dans l'arborescence de ton site une bonne fois pour toute, upload le avec filezilla (ou autre).

    Je me suis trompé dans mon précédent message, c'est stream_get_line (à utiliser à la place de fgets) et pas stream_get_contents. L'avantage par rapport à fgets c'est qu'il te fournit la ligne sans le saut de ligne (si tu lui précise en paramètre) et t'évite d'utiliser trim ensuite.

    Privilégie les comparaisons strictes === quand c'est possible, c'est plus claire et plus rapide.

    ...je suis d'accord qu'avec une base de donnée, ça serait mieux mais ça complexifie les choses, je maîtrise pas du tout...
    Maintenant que tu as une V1 fonctionnelle, rien ne t'empêche de tenter le coup.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Par défaut
    J'ai réglé mon problème de d'upload de de mon dictionnaire, là, par contre j'aimerai apporter une petite modification à mon code mais j'arrive à rien aujourd'hui :

    J'aimerai ajouter la possibilité d'ajouter des lettres de début et des lettres de fin dans mon formulaire car pour l'instant, on peut chercher des mots en tapant une lettre de début et une lettre de fin.
    Comment je peux faire ça ?

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 020
    Par défaut
    Si j'ai bien compris, tu veux pouvoir préciser plusieurs lettres comme première lettre possible et idem pour la fin.

    Avec preg_match mais dans ce cas tu dois vérifier que le champ "lettres début" n'est pas vide avant de faire le test, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (!empty($lettresdebut) && !preg_match('~\A [' . preg_quote($lettresdebut, '~') . '] ~x', $mot)) {
        continue; // on saute au prochain mot de la boucle foreach
    }
     
    if (!empty($lettresfin) && !preg_match('~ [' . preg_quote($lettresfin, '~') . '] \z ~x', $mot)) {
        continue; // on saute au prochain mot de la boucle foreach
    }
    (les crochets délimitent une classe de caractères, \A et \z sont les ancres de début et fin de chaîne, et x permet d'ignorer les espaces dans la pattern.)
    Tu peux aussi extraire la première lettre du mot et vérifier qu'elle est présente dans $lettresdebut avec strpos.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2006, 16h51
  2. Outil d'aide à la création d'une DTD
    Par Elmilouse dans le forum Valider
    Réponses: 1
    Dernier message: 28/02/2006, 01h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo