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 :

[Dates] "concaténation" de fonction substr et autres [Fait]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Points : 99
    Points
    99
    Par défaut [Dates] "concaténation" de fonction substr et autres
    Bonjour à tous ,

    Je suis en train d'effectuer des modifications sur des chaînes de charactères issues d'un fichier .dat en vue d' en céer une base de données :
    Je faisait ceci au début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $SID_Modif_EMEA =(str_replace("EMEA\\","", $SID_Name));
    			$SID_Modif_User =(str_replace("(User)","", $SID_Modif_EMEA));
    			$SID_Modif_Alias=(str_replace("(Alias)","", $SID_Modif_User));
    			$SID_Modif_Equal = (str_replace(" = ", "", $SID_Modif_Alias));
    			$SID_Modif_Name=(str_replace("SID Name ", "", $SID_Modif_Equal));
    			$SID_Modif_Final=STRIPSLASHES($SID_Modif_Name);
    Mais c'est relativement moche long et fastidieu surtout que c'est que pour un champ.

    En réflechissant un peu ( euuhh oui ca m'arrive défois non mais !) :
    Je me suis dit : Est ce que c'est possible de faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo substr($SID_Name,23,[jusqu'au prochain espace trouvé]);
    Je ne sais pas si c'est réalisable mais si vous avez des idées je suis prenneur . Merci
    Cordialment.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Pour trouver un caractère dans une chaîne vous avez les fonctions strpos et consoeurs. Toutefois, ne serait-il pas plus simple d'avoir recours ici à une expression régulière ?

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Points : 99
    Points
    99
    Par défaut
    Je ne pense pas que me servir d'expression régulière soit dans mon cas plus approprié car mon fichier de réference est de la manière suivante :

    FileSystemControlFlags = 0x00000031
    Quotas are tracked on this volume
    Logging enable for quota limits and threshold
    The quota values are up to date

    Default Quota Threshold = 0xffffffffffffffff
    Default Quota Limit = 0xffffffffffffffff

    SID Name = BUILTIN\Administrators (Alias)
    Change time = Wed Mar 14 10:31:15 2007
    Quota Used = 23847144448
    Quota Threshold = 18446744073709551615
    Quota Limit = 18446744073709551615

    SID Name = SEVOF062001\Intranet (User)
    Change time = Sun Mar 11 00:25:18 2007
    Quota Used = 143547392
    Quota Threshold = 18446744073709551615
    Quota Limit = 18446744073709551615

    SID Name = EMEA\DLENAVE (User)
    Change time = Wed Mar 14 07:33:50 2007
    Quota Used = 2058409984
    Quota Threshold = 18446744073709551615
    Quota Limit = 18446744073709551615
    J'aimerai récuperer :
    BUILTIN\Administrators
    SEVOF062001\Intranet
    DLENAVE
    ...
    C'est pourquoi je veut retirer la chaîne qui va de
    : = (exclus) à espace avant la parenthèse.

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Points : 99
    Points
    99
    Par défaut
    Apres deux bonnes heures de prise de tête j'ai réalisé ceci :
    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
    if($SID_Name = (strstr($texte, "SID Name")))
    		{
    			//Incrementation de l'ID
    			$Id ++;
     
    			//Selection de la chaine contenant le nom = return array()
    			$Tab_SID=array("SID");
    			$Tab_SID=Explode("\\",$SID_Name);
    			$SID_Modif_Alias=(str_replace("(Alias)","", $Tab_SID[1]));
    			$SID_Modif_User =(str_replace("(User)", "", $SID_Modif_Alias));
    			echo($SID_Modif_User);
     
    			//Selection de la chaine contenant le quota = return array()	
    			$Quota = (strstr($texte ,"Quota Used"));
    			$Tab_Quota=array("Quota");
    			$Tab_Quota=Explode("=",$Quota);
    			echo($Tab_Quota[0]);
    			echo("<BR>");
     
    			//Insertion des données dans SQL
    			/*$query ="Insert into Quota.Data (ID,SID) VALUES('".$Id."','".$SID_Modif_User."');";
    			echo($query);
    			echo("<BR>");
    			$result= mysql_query($query) or die (mysql_error());*/
     
    		}
    Qu'en pensez-vous ?
    Le je medite encore sur le tableau quota qui me retourne soit array soit :
    Notice: Undefined offset: 1 !

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par javaboy
    Je ne pense pas que me servir d'expression régulière soit dans mon cas plus approprié car mon fichier de réference est de la manière suivante :
    Dans la mesure où toutes les données sont organisées de la même manière, je pense que vous vous trompez sur ce point :
    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
     
    <?php
    $string = <<< STRING
    FileSystemControlFlags = 0x00000031
    Quotas are tracked on this volume
    Logging enable for quota limits and threshold
    The quota values are up to date
     
    Default Quota Threshold = 0xffffffffffffffff
    Default Quota Limit = 0xffffffffffffffff
     
    SID Name = BUILTIN\Administrators (Alias)
    Change time = Wed Mar 14 10:31:15 2007
    Quota Used = 23847144448
    Quota Threshold = 18446744073709551615
    Quota Limit = 18446744073709551615
     
    SID Name = SEVOF062001\Intranet (User)
    Change time = Sun Mar 11 00:25:18 2007
    Quota Used = 143547392
    Quota Threshold = 18446744073709551615
    Quota Limit = 18446744073709551615
     
    SID Name = EMEA\DLENAVE (User)
    Change time = Wed Mar 14 07:33:50 2007
    Quota Used = 2058409984
    Quota Threshold = 18446744073709551615
    Quota Limit = 18446744073709551615
    STRING;
     
    $nb = preg_match_all('#SID Name = ([[:alnum:]\\\]+?) \((?:User|Alias)\).+Quota Used = ([[:digit:]]+?)#Us', $string, $m);
    if ($nb > 0) {
        for ($i = 0; $i < $nb; $i++) {
            echo $m[1][$i] . ' =&gt; ' . $m[2][$i] . '<br/>';
        }
    }
    ?>
    Qui produit le résultat :
    BUILTIN\Administrators => 23847144448
    SEVOF062001\Intranet => 143547392
    EMEA\DLENAVE => 2058409984
    Libre à vous ...

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Points : 99
    Points
    99
    Par défaut
    Waooou !

    Désoler de mon ignorance mais je ne maîtrise absolument pas les expression régulière , d'ailleur c'est difficlement compréhensible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $string = <<< STRING ....STRING;
    Est-il possible de lui donner directement le fichier au lieu de coller tout son contenu. Je ne connai absolument pas cette syntaxe ?
    Merci pour votre aide et patience .
    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
    //variables globales
    $fichier = "/home/httpd/dev/_it_tools/files/quota.dat";
     
     
    //Test si le fichier est bien sur le serveur :
    if (file_exists($fichier)) 
    {
    	//Ouvre le fichier
    	$monfichier = fopen("$fichier", "r+");
     
    	//Variable identifiant (clef primaire)
    	$Id = 0;
     
    	//Boucle tant que non fin de fichier 
    	while(!feof($monfichier))
    	{
    		//Lecture du fichier
    		$texte =(fgets($monfichier));
    		$string = $texte
     
    		$nb = preg_match_all('#SID Name = ([[:alnum:]\\\]+?) \((?:User|Alias)\).+Quota Used = ([[:digit:]]+?)#Us', $string, $m);
    		if ($nb > 0) 
    		{
    			for ($i = 0; $i < $nb; $i++) 
    			{
    			echo $m[1][$i] . ' =&gt; ' . $m[2][$i] . '<br/>';
    			}
    		}

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par javaboy
    Désoler de mon ignorance mais je ne maîtrise absolument pas les expression régulière , d'ailleur c'est difficlement compréhensible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $string = <<< STRING ....STRING;
    C'est la syntaxe qu'on appelle HEREDOC.

    Citation Envoyé par javaboy
    Est-il possible de lui donner directement le fichier au lieu de coller tout son contenu.
    Oui vous pouvez faire cela directement avec la fonction file_get_contents (PHP >= 4.3.0) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (file_exists($fichier)) {
        $content = file_get_contents($fichier);
        $nb = preg_match_all('#SID Name = ([[:alnum:]\\\]+?) \((?:User|Alias)\).+Quota Used = ([[:digit:]]+?)#Us', $content, $m);
        if ($nb > 0) {
            for ($i = 0; $i < $nb; $i++) {
                echo $m[1][$i] . ' =&gt; ' . $m[2][$i] . '<br/>';
            }
        }
    } else {
        die("Erreur : le fichier donné n'existe pas");
    }
    Ou si vous tenez à utiliser les fonctions fopen, fread/fgets, fclose :
    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
     
    if (file_exists($fichier)) 
    {
    	//Ouvre le fichier
    	$monfichier = fopen("$fichier", "r+");
     
    	//Variable identifiant (clef primaire)
    	$Id = 0;
    	$string = ''; # Evite un warning en la déclarant avant
    	//Boucle tant que non fin de fichier 
    	while(!feof($monfichier))
    	{
    		//Lecture du fichier
    		$string .= fgets($monfichier);
    	}
    	fclose($monfichier);
    	$nb = preg_match_all('#SID Name = ([[:alnum:]\\\]+?) \((?:User|Alias)\).+Quota Used = ([[:digit:]]+?)#Us', $string, $m);
    	if ($nb > 0) 
    	{
    		for ($i = 0; $i < $nb; $i++) 
    		{
    			echo $m[1][$i] . ' =&gt; ' . $m[2][$i] . '<br/>';
    		}
    	}
    }
    Mais l'expression régulière doit être faite après la lecture du fichier.

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Points : 99
    Points
    99
    Par défaut
    Je vais me pencher sérieusement sur votre aide afin de comprendre ce que je code je vous remercie en attendant pour votre aide.
    Merci

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par javaboy
    Je vais me pencher sérieusement sur votre aide afin de comprendre ce que je code je vous remercie en attendant pour votre aide.
    N'hésitez pas dans ce cas à demander

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Points : 99
    Points
    99
    Par défaut
    Bon j'ai attentivement lu la syntaxe HEREDOC, je me suis documenter rapidement sur la fonction preg_match_all et sur les expression régulière.
    Ce passage reste encore obscur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    '#SID Name = ([[:alnum:]\\\]+?) \((?:User|Alias)\).+Quota Used = ([[:digit:]]+?)#Us', $content, $m);
    	if ($nb > 0) 
    	{
    		echo($nb);
            for ($i = 0; $i < $nb; $i++) 
    		{
                echo $m[1][$i] . ' =&gt; ' . $m[2][$i] . '<br/>';
            }
    Enfin bon quand je l'éxécute il me retourne :
    Erreur : le fichier donné n'existe pas
    Cependant dans la boucle:
    (file_exists($fichier)) {
    $content = file_get_contents($fichier);...
    j'ai fait un echo($content)
    La chaîne est bien présente . A quoi cela est du



    -suite-
    J'ai plus ou moin trouver le probleme est du à $nb car il vaut 0 donc si j'ai bien compris il ne rencontre aucune oocurence et va directement de Else ce pendant je me demande a qoui cela est du ?

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Pour le SID : [[:alnum:]\\\]+, désigne tout ensemble (au moins un) de caractères alpha numériques ou back-slash. Les parenthèses autour de cette expression nous permettent de les conserver en mémoire pour un futur usage (dans le tableau $m).

    \((?:User|Alias)\) : il va chercher (User) ou bien (Alias) mais sans garder en mémoire cette correspondance. C'est ce qu'on appelle une parenthèse non capturante parce qu'elle débute immédiatement par ?: Les parenthèses étant des caractères spéciaux dans une expression régulière, il faut donc les échapper pour qu'elles retrouvent leur valeur en tant que simple caractère.

    Pour le quota : [[:digit:]]+, désigne un nombre (tout ensemble de chiffres). Les parenthèses entourant cette expression indiquent également de conserver ce qui correspondra à ce motif en mémoire.

    Le tableau $m, comme je le disais ci-dessus va contenir à l'issue de la fonction preg_match_all, toutes les chaînes qui corresponent aux différents motifs capturant. Ainsi, le tableau $m[1] fait référence à toutes les occurences de la première parenthèse capturante (ce qui correspond aux SIDs) ; $m[2] à la deuxième (les quotas).

    Peut être, l'aviez-vous vu mais je vous recommande, le tutoriel suivant au sujet des expressions régulières : Initiation aux expressions régulières en PHP

    PS : J'avais oublié une accolade fermante dans le premier code (avec file_get_contents).

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Points : 99
    Points
    99
    Par défaut
    Merci pour toute ces infos et pour le lien je m'y met tout de suite...

    -Suite-
    Désoler d'ouvrir et de fermer le "resolu", mais un gros probleme se pose a moi :
    Apres avoir plus ou moin compris les expressions régulières, leurs syntaxes ...
    La boucle que vous m'avez donnée ne retourne rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb = preg_match_all('#SID Name = ([[:alnum:]\\\]+?) \((?:User|Alias)\).+Quota Used = ([[:digit:]]+?)#Us', $string, $m);
    Quand je l'éxécute nb retourne 0, donc 0 occurence. Si j'ai bien assimilé, donc pas de résultats.
    Maintenant apres avoir lu les tutos je me suis tenté à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#([[:alnum:]\\\]+?) \((?:User|Alias)\).+([[:digit:]]+?)#Us'
    Qui lui me retourne des résultats (peu concrets mais c'est normal)
    Je me demande si le fait de mettre :
    SID Name = ....
    .+Quota Used = ....
    Ne fait pas capoter l'expression . Est il possible de la remplacer par un code héxa ou html ou autre. Ces résultats doivent être parfaitement formatés dans la mesure ou ils sont destinés à être sql-isés, en vue de statistiques.
    Merci pour toute votre attention .

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Points : 99
    Points
    99
    Par défaut
    Bon j'ai essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '# = ([[:alnum:]\\\]+?) \((?:User|Alias)\).+ = ([[:digit:]]+?)#Us'
    Qui me retourne des resultats concrets et cohérants .Merci
    je resolve pour la dernière fois

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

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