Comparaion de string en php

J'aimerais comparer deux chaines de caractères pour savoir si la première contient un bout de la deuxième .. Je m'explique

J'ai la première chaine qui ressemble à ca :

Infos/technique/OS/Windows/Windows 98/

La deuxième ressemble à ca :

Windows 98

J'aimerais simplement savoir comment tester que le "Windows 98" est bien contenu dans la première chaine ?

Merci d'avance

13 réponses

Résumé de la discussion

La discussion porte sur la méthode pour vérifier en PHP si la première chaîne contient une sous-chaîne donnée, en prenant l'exemple 'Windows 98' dans 'Infos/technique/OS/Windows/Windows 98/'. Des solutions utilisent des fonctions comme explode pour manipuler les chemins et vérifier la présence d'un segment, tout en traitant les échappements et les caractères spéciaux qui posent problème dans PHP. Plusieurs réponses abordent les défis d'échapper les antislashs et les guillemets, proposent des ajustements comme str_replace ou htmlspecialchars et présentent des variantes d'emploi de explode avec des séparateurs tels que '/'. D'autres discussions ajoutent que la solution pratique consiste souvent à normaliser les séparateurs de chemin et à exploiter explode, afin de traiter les segments un par un sans erreurs d'échappement.

Bobot (l’IA à votre service)
  1. Voila le fichier listedir.php avec la déclaration de variable au début .. avant j'utilisais pas de variable et je mettais "." pour le dossier ca marchait .. Maintenant quand je rentre un dossier, ca marche desfois à moitié ...

    -----------SIMNET SA WEB SOURCE WWW.SIMNETSA.CH---------

    <html>

    <head>

    </head>

    <body>
    <?

    //SOURCE DU PROBLEME EST ICI
    $dossiercours = "../Windows";

    $Dir = htmlspecialchars($dossiercours);

    $Dir = str_replace("\\", "/", $Dir);

    $champs = explode ("/", $Dir);

    $boucle=0;
    while ($boucle < sizeof($champs)-1) {

    $boucle++;
    }
    $lienrel = $champs[$boucle];
    $champs[$boucle] = ucfirst( strtolower($champs[$boucle]) ) ;
    ?>

    <div align="center">
    <center>
    <table border="0" cellpadding="3" cellspacing="3" style="border-collapse: collapse" bordercolor="#111111" width="84%" id="AutoNumber1">
    <tr>
    <td width="164">
    <p align="left">
    <img border="0" src="images/Dossier_Petit.jpg" width="125" height="68"></td>
    <td width="76%" valign="bottom"><b>
    <font face="Verdana" size="5" color="#000080"><?echo $champs[$boucle];?></font></b></td>
    </tr>
    <tr>
    <td width="100%" colspan="2" style="border-left-width: 1; border-right-width: 1; border-top: 1px solid #000080; border-bottom-width: 1"> </td>
    </tr>
    </table>
    </center>
    </div>
    <p> </p>
    <div align="center">
    <center>
    <table border="0" cellpadding="3" cellspacing="3" style="border-collapse: collapse" bordercolor="#111111" width="85%" id="AutoNumber1" height="98">
    <tr>
    <td width="33%" height="30" valign="top">
    <table border="1" cellpadding="0" style="border-collapse: collapse" bordercolor="#111111" width="101%" id="AutoNumber2" height="36">
    <tr>
    <td width="101%" bgcolor="#482B7F" height="13">
    <p align="center"><b><font face="Verdana" size="1" color="#FFFFFF">
    <?echo $champs[$boucle];?> (Général)</font></b></td>
    </tr>

    <?
    include "connectbd.php";
    $sql = "select * from ".$prefixe."_dossiers order by nomdossier";
    $resultat = mysql_query($sql);
    while($ligne = mysql_fetch_array($resultat)){
    $id_dossier = $ligne["id_dossier"];
    $nomdossier = $ligne["nomdossier"];
    $descriptiondossier = $ligne["descriptiondossier"];
    $liendossier = $ligne["liendossier"];

    $champs2 = explode ("/", $liendossier);

    $boucle2=0;
    while ($boucle2 < sizeof($champs2)-1)
    {
    $boucle2++;
    }

    $lien = $lienrel."/".$champs2[$boucle2];

    $test = eregi("$lien",$liendossier);
    if ($test == "1"):
    {
    ?>
    <tr>
    <td height="12"><font face="Verdana" size="1"> -<?echo("<a style=\"text-decoration: none\" href=%22index.php?Page=administration/$liendossier//"> $nomdossier");?></font></td>
    </tr>
    <?
    }
    endif;
    }
    ?>

    </table>
    </td>

    <?
    $rep=opendir($dossiercours);
    $compteur=0;
    while ($file = readdir($rep)) {
    if($file != '..' && $file !='.' && $file !=''){
    if (is_dir($file)){
    $compteur++;

    if ($compteur%3!=0):
    {
    ?>

    <td width="33%" height="30" valign="top">
    <table border="1" cellpadding="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber3" height="37">
    <tr>
    <td width="101%" bgcolor="#482B7F" height="13">
    <p align="center"><b><font face="Verdana" size="1" color="#FFFFFF">
    <?echo("$file");?></font></b></td>
    </tr>

    <?

    include "connectbd.php";
    $sql = "select * from ".$prefixe."_dossiers order by nomdossier";
    $resultat = mysql_query($sql);
    while($ligne = mysql_fetch_array($resultat)){
    $id_dossier = $ligne["id_dossier"];
    $nomdossier = $ligne["nomdossier"];
    $descriptiondossier = $ligne["descriptiondossier"];
    $liendossier = $ligne["liendossier"];
    $test = eregi("$file",$liendossier);
    if ($test == "1"):
    {
    ?>
    <tr>
    <td height="12"><font face="Verdana" size="1"> -<?echo("<a style=\"text-decoration: none\" href=%22index.php?Page=administration/$liendossier//"> $nomdossier");?></font></td>
    </tr>
    <?
    }
    endif;
    }
    ?>
    </table>
    </td>

    <?
    }
    else:
    {
    ?>

    </tr>
    <tr>
    <td width="33%" height="30" valign="top">
    <table border="1" cellpadding="0" style="border-collapse: collapse" bordercolor="#111111" width="101%" id="AutoNumber5" height="36">
    <tr>
    <td width="101%" bgcolor="#482B7F" height="13">
    <p align="center"><b><font face="Verdana" size="1" color="#FFFFFF">
    <?echo("$file");?></font></b></td>
    </tr>
    <?

    include "connectbd.php";
    $sql = "select * from ".$prefixe."_dossiers order by nomdossier";
    $resultat = mysql_query($sql);
    while($ligne = mysql_fetch_array($resultat)){
    $id_dossier = $ligne["id_dossier"];
    $nomdossier = $ligne["nomdossier"];
    $descriptiondossier = $ligne["descriptiondossier"];
    $liendossier = $ligne["liendossier"];
    $test = eregi("$file",$liendossier);
    if ($test == "1"):
    {
    ?>
    <tr>
    <td height="12"><font face="Verdana" size="1"> -<?echo("<a style=\"text-decoration: none\" href=%22index.php?Page=administration/$liendossier//"> $nomdossier");?></font></td>
    </tr>
    <?
    }
    endif;
    }
    ?>

    </table>
    </td>
    <?
    }
    endif;

    }
    }
    }
    closedir($rep);
    clearstatcache();
    ?>

    <td width="33%" height="30" valign="top"> </td>
    </tr>
    </table>
    </center>
    </div>

    </body>

    </html>

    -----SIMNET SA AUTORISE LA MODIFICATION ET REPRISE------
    1. Il y aurait un probleme de droit si tu ecrivais quelque chose, mais comme tu ne fais que lire... Ca doit pas etre ca...
      A mon avis, la valeur passée à Opendir n'est pas bonne...

      Kalamit,
      Je ponce donc j'essuie
      1. Pages/administration/technique/OS/Windows/

        Quand je mets ca il devrait me sortir les dossiers que j'ai dans le répertoire Windows mais non il sort rien du tout ..

        tandis que :

        Pages/administration/

        Il me sort un dossier "images" qui est bien et bel existant mais le dossier administration contient 6 autres dossiers qui ne sortent pas .. Je comprends vraiment rien ...
      2. @GuillaumeC'est un peu galere, j'ai rien pour tester. Tu es pas trop loin de la solution, je vais regarder ton code en détail.

        Kalamit,
        Je ponce donc j'essuie
      3. @kalamitVeux tu le code en entier ? Parce que la il n'est que partiel ..

        C'est d'ailleurs pour ca qu'il n'y a pas toutes les accolades qui sont fermées. . mon code est parfaitement juste et fonctionne .. il y a un problème au niveau de la variable dossiercours et de la fonction opendir ...
    2. Voila qu'il me sort un dossier maintenant .. serait-ce une kestion de droit ? J'ai XP et j'arrive pas à modifier les droits sur les fichiers ... Vous avez une idée ?!?!
      1. Bobinours .. C'est à cause que l'antislash est caractères fonctionnel sous php non ?

        Et encore une kestion .. voici mon code :

        $rep=opendir($dossiercours);
        $compteur=0;
        while ($file = readdir($rep)) {
        if($file != '..' && $file !='.' && $file !=''){
        if (is_dir($file)){
        $compteur++;

        if ($compteur%3!=0):
        {
        ?>

        <td width="33%" height="30" valign="top">
        <table border="1" cellpadding="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber3" height="37">
        <tr>
        <td width="101%" bgcolor="#482B7F" height="13">
        <p align="center"><b><font face="Verdana" size="1" color="#FFFFFF">
        <?echo("$file");?></font></b></td>
        </tr>

        <?

        include "connectbd.php";
        $sql = "select * from ".$prefixe."_dossiers order by nomdossier";
        $resultat = mysql_query($sql);
        while($ligne = mysql_fetch_array($resultat)){
        $id_dossier = $ligne["id_dossier"];
        $nomdossier = $ligne["nomdossier"];
        $descriptiondossier = $ligne["descriptiondossier"];
        $liendossier = $ligne["liendossier"];
        $test = eregi("$file",$liendossier);
        if ($test == "1"):
        {
        ?>
        <tr>
        <td height="12"><font face="Verdana" size="1"> -<?echo("<a \"text-decoration: none\" href=%22index.php?Page=administration/$liendossier//"> $nomdossier");?></font></td>
        </tr>
        <?
        }
        endif;
        }
        ?>

        Sur l'opendir, il me fait aucune erreur, ce qui veut dire qu'il arrive bien à ouvrir le dossier .. ensuite je lui demande de me lister les répertoires et de me les afficher dans un tableau .. mais rien n'apparait .. si je place le code dans le répertoire en cours et que je fais opendir('.'); ca marche .. mais j'aimerais faire un opendir d'un dossier distant et lister son contenu ...
        1. Qu'est ce qu'il y a comme valeur dans ta variable $dossiercours ? Tu dois mettre le path de ton repertoire depuis la racine du site. (enfin il me semble...)

          Kalamit,
          Je ponce donc j'essuie
        2. Euh... Je sais pas comment ça se fait que tu n'aies pas d'erreur, parce que dans ton code il n'y a presque aucune fermeture d'accolade ouvrante...

          -= Bobinours - http://bobin.underlands.org =-
      2. Je m'étais planté .. j'avais inversé les deux string .. ca marche maintenant .. enfin :-) .. Enfin me reste toute la gestion derrière à programmer mais le gros ca marche ..
        1. Et ca marche nickel ? Tout va bien alors !
          N'hesites pas si tu as d'autres problemes. Je peux t'aiguiller te mettre sur la voie, mais j'evite de te donner des réponses toutes faites... Tu ne progresserais pas. (Et je suis en vacances la semaine prochaine :o)) )

          Kalamit,
          Je ponce donc j'essuie
          1. Je viens de programmer un BackOffice complet en PHP avec gestion d'arborescence etc ... C'est un énorme projet et malheureusement certaines fonctions ne sont pas encore dans ma tete .. heureusement que certains forums comme celui-ci existe avec des réponses précises et pertinentes ...
          2. Si qqn a encore une solution ..

            ma fonction ereg ne retourne ni true ni false .. elle ne retourne rien et ne fait pas d'erreur .. Je pige vraiment rien
          3. @Guillaume$test = ereg (....,....);
            echo "$test";

            Ca te retourne rien, ca ?

            Kalamit,
            Je ponce donc j'essuie
        2. <?

          $Dir = getcwd();
          $Dir = htmlspecialchars($Dir);

          $Dir = str_replace("\\", "/", $Dir);

          $champs = explode ("/", $Dir);
          echo "$Dir";
          $boucle=0;
          while ($boucle < sizeof($champs)-1) {

          $boucle++;
          }

          ?>

          C'est tout bon
          1. @BobinoursEffectivement

            J'ai essayé 30000 fonctions dans ce truc et certains font des trucs à doubles ..
            On va faire de l'ordre :-)
          2. @BobinoursC'est vrai que c'est tordu et pas top optimisé... Mais si ca marche... :o)

            Kalamit,
            Je ponce donc j'essuie
          3. @BobinoursBah je dirais que c'est un caractere reservé... C'est comme en C qd tu veux mettre des quotes dans une chaine de caracteres, tu en mets deux de suite...
            Enfin, je crois...

            Kalamit,
            Je ponce donc j'essuie
        3. $champs = explode ("\", $Dir);

          Il comprends rien PHP a cause du \ ... Comment lui dire qu'il doit quand meme travailler avec ce caractère ?

          Fait un str_replace ? Il fait aussi une erreur ...
          1. Heu, ca veut dire quoi, "il comprends rien PHP" ? C'est quoi ton erreur ? J'ai rien pour tester, la...

            Kalamit,
            Je ponce donc j'essuie
          2. @kalamitParse error: parse error, unexpected T_VARIABLE in c:\program files\easyphp\www\simnet\pages\administration\technique\os\windows\listedir.php on line 17

            Simplement quand je fais :

            $champs = explode ("\", $Dir);

            Dès que je met le "\", il fait une erreur car il le prends comme caractères spécial ...
        4. Bah après il te suffit de découper la chaine à partir du dernier "\" que tu trouves...
          Faisable avec explode(), http://www.php.net/manual/fr/function.explode.php
          J'ai pas trouver de fonction qui te renvoie le nom du repertoire courant...

          Kalamit,
          Je ponce donc j'essuie
          1. Bon vu que j'ai qqn qui m'écrit mon code .. j'ose encore te poser une question ... j'ai pas trop envie de réfléchir un max .. comment je fais pour prendre le dernier morceaux de mon url .. style que le nom du répertoire .. Est qu'on peut directement avoir accès à la derniere case du tableau créé par explode() ?

            Merci encore
          2. Cherche un peu avant ! :o))))
            C'est pas bien dur...

            Kalamit,
            Je ponce donc j'essuie
        5. La commande me retourne tout le chemin .. moi je veux juste le nom du répertoire ...
          1. Merci beaucoup ..

            Bon maintenant qu'on est lancé .. encore une petite question .. j'aimerais sortir le nom du répertoire ou le fichier est posé ..

            J'ai réussi à avoir le chemin complet sur le disque mais j'aimerais juste le nom du répertoire (".") ... Merci
            1. Salut,
              c'est faisable avec la fonction reguliere standard ereg()

              $test = ereg ( "Infos/technique/OS/Windows/Windows 98/ ","Windows 98 ")

              Dans ce cas la, $test = true.

              Tu auras plus d'infos ici: http://www.php.net/manual/fr/function.ereg.php

              Il existe un paquet de fonction pour manipuler les chaines, ereg en est une.
              A+ !

              Kalamit,
              Je ponce donc j'essuie