8798 sujets

Développement web côté serveur, CMS

Pages :
Bonsoir cela fait 2 semaine que je m'acharne comment découper une chaine donc bien entendu j'essaye d'utiliser substr etc... mais je n'y arrive pas si vous avez un exemple pour ma chaine la voici

admin=bandwidth=448.0 / unlimited&creator=root&default=mondomaine.com&ip=127.0.0.1&list=mondomain.com
&quota=3543.9 / unlimited&suspended=No&type=reseller&vdomains=1 / unlimited

Tout se qui et en gras dans la chaine c'est que je voudrait récupérer.

Donc j'ai commencer a faire ceci pour extraire l'username


// On récupère l'username
$username = '';
if (preg_match('/^(.+)\b/U', $line, $matches)) {
$username = $matches[1];
} else {
$username = $line;
}
echo $username; // Donc cela affiche admin


Après je sèche je ne comprend plus comment extraire le bandwidth.

Merci pour votre aide Smiley cligne
Modifié par staff (20 Jun 2009 - 01:43)
Salut,

Quelques questions :
- quelles sont la parties de la chaine qui peuvent changer ?
- quelles parties de la chaine qui peuvent être absentes ?
- le retour à la ligne après mondomain.com fait-il bien parti de la chaine ?

Pour illustrer tout ça, tu pourrais donner des exemples des différentes formes que peut prendre ta chaine.
Modifié par marcv (20 Jun 2009 - 10:27)
1 . Les parties qui peuvent changer sont admin sa peut être un autre login, 448.0 / unlimited bande passante qui peuvent varié, root, mondomaine.com, 127.0.0.1, mondomain.com je précise que c'est avec la key 'list', 3543.9 / unlimited quota qui peuvent varié également, No qui change par yes si le compte et suspendu, reseller, 1 / unlimited qui veut dire le nombre de domaine utilisé

2 . Aucune partie peut être absentes.

3 . Toute la ligne fait bien partie de la chaine

Merci pour ta réponses espérant de t'avoir aider Smiley cligne

Je voudrait mettre sa sous forme de tableau voici mon exemple que j'ai fait


$sock->query('/CMD_API_ALL_USER_USAGE');
$lines = explode ("\n", $sock->fetch_body());

foreach ($lines as $line)
{
// On récupère l'username
$username = '';
if (preg_match('/^(.+)\b/U', $line, $matches)) {
$username = $matches[1];
} else {
$username = $line;
}
					
					
echo "<tr>";
echo "<td nowrap='nowrap'><img src=\"".(URL)."icones-png/user.png\" alt=\"Login\" border=\"0\" width=\"16\" height=\"16\" class=\"imgmiddle\">".$username."</td>";
echo "<td align=\"center\">cet ligne va me permettre d'afficher le createur du compte</td>";
echo "<td align=\"center\">cet ligne va me permettre d'afficher la bande passante</td>";
etc.........
echo "</tr>";
}

Modifié par staff (20 Jun 2009 - 11:22)
Ça devrait faire l'affaire :
$taChaine = "admin=bandwidth=448.0 / unlimited&creator=root&default=mondomaine.com&ip=127.0.0.1&list=mondomain.com\n&quota=3543.9 / unlimited&suspended=No&type=reseller&vdomains=1 / unlimited";

preg_match('/^
	    ([^=]*)
	    =bandwidth=([^&]*)
	    &creator=([^&]*)
	    &default=([^&]*)
	    &ip=([^&]*)
	    &list=([^&]*)
	    &quota=([^&]*)
	    &suspended=([^&]*)
	    &type=([^&]*)
	    &vdomains=([^&]*)
	$/x', $taChaine, $matches);

echo '<pre>' . print_r($matches, true) . '</pre>';

Modifié par marcv (20 Jun 2009 - 12:08)
Et si tu ne souhaites pas récupérer les retours à la ligne à la fin des valeurs :
preg_match('/^
	    ([^=]*)
	    =bandwidth=([^&]*)\s*
	    &creator=([^&]*)\s*
	    &default=([^&]*)\s*
	    &ip=([^&]*)\s*
	    &list=([^&]*)\s*
	    &quota=([^&]*)\s*
	    &suspended=([^&]*)\s*
	    &type=([^&]*)\s*
	    &vdomains=([^&]*)\s*
	$/xU', $taChaine, $matches);
Ok good par contre j'y est pas penser dans la key 'list' il mette aussi les pointeur de domaine donc la chaine qui ressemble a celle ci

Donc celle ci a des infos en plus:
jigger=bandwidth=661.0 / 90000&creator=admin&default=domaine.power-hosting.biz&ip=127.0.0.1&list=domaine.power-hosting.biz<br>dommaine2.net<br>&pointer_domaine.power-hosting.biz=domaine.com|&quota=127.9 / 4000&suspended=No&type=user&vdomains=2 / 5*

Celle ci est d'origine:
admin=bandwidth=448.0 / unlimited&creator=root&default=mondomaine.com&ip=127.0.0.1&list=mondomain.com
&quota=3543.9 / unlimited&suspended=No&type=reseller&vdomains=1 / unlimited

et donc si je suis le bout de code que tu ma fourni je veut afficher par exemple le creator donc matches[3] il y'a un décalage pour ceux qui on plus d'infos

Espérant de m'avoir bien expliquer

Edit: si je fait un echo sur les personnes qui on plus d'infos il n'affiche rien

Array
(
)
Modifié par staff (20 Jun 2009 - 12:45)
OK, nouvel essai :
preg_match('/^
	    ([^=]*)
	    =bandwidth=(.*)\s*
	    &creator=(.*)\s*
	    &default=(.*)\s*
	    &ip=(.*)\s*
	    &list=(.*)\s*
	    &quota=(.*)\s*
	    &suspended=(.*)\s*
	    &type=(.*)\s*
	    &vdomains=(.*)\s*
	$/x', $taChaine2, $matches);
Cool c'est presque sa en fait juste 2 erreur sa m'affiche se genre d'erreur

Notice: Undefined offset: 3

Et l'autre ce n'est pas tout a faire une erreur c'est que quand c'est un pointer sa m'affiche ceci exemple &pointer_chevaleonard.net=chevaleonard.com| donc quand c'est un pointeur je veut que sa affiche P chevaleonard.net

Merci vraiment pour ton aide parce que je commençai a saturer 2 semaine c'est a s'arracher les cheveux
Je te propose la chose suivante, pour qu'on y passe pas le week-end Smiley cligne : donne plusieurs chaines possibles, et pour chacune d'elles la liste des résultats que tu veux récupérer. Voici un exemple :

chaine
admin=bandwidth=448.0 / unlimited&creator=root&default=mondomaine.com&ip=127.0.0.1&list=mondomain.com
&quota=3543.9 / unlimited&suspended=No&type=reseller&vdomains=1 / unlimited
sous-chaînes que tu veux extraire
admin
448.0 / unlimited
root
mondomaine.com
127.0.0.1
mondomain.com
3543.9 / unlimited
No
reseller
1 / unlimited
je t'ai envoyer le fichier par mp pour que tu comprenne sa va être plus simple parce que comme tu dit on va pas y passer le week end malgré qu'il est bien entamer parce que moi 2 semaines pour faire sa je commence a saturer Smiley decu
Je t'ai répondu par MP que je préfère pas finir cette conversation par MP Smiley langue

Ton fichier, c'est exactement ce dont on a besoin pour t'aider, et je crois que tu peux sans problème recopier son contenu dans le forum (en anonymisant légèrement deux trois clefs si tu veux), afin que tout le monde en profite.
Ok donc voici ma chaine je l'upload parce que la mettre entière sur le forum sa va faire grand

Lien de téléchargement :
http://filzup.com/download.php?id=A4A4473E1

Donc je doit faire obligatoirement appelle comme ceci:


$sock->query('/CMD_API_ALL_USER_USAGE');
$lines = $sock->fetch_body();


le CMD_API_ALL_USER_USAGE c'est le fichier que j'ai uploader

merci pour vos réponses
Modifié par staff (21 Jun 2009 - 20:56)
Perso, voilà ce que je peux faire de mieux avec une seul regex :
preg_match('/^
        ([^=]*)
        =bandwidth=(.*)\s*
        &creator=(.*)\s*
        &default=(.*)\s*
        &ip=(.*)\s*
        &list=(.*)\s*
        (&pointer_(?:.+))?
        &quota=(.*)\s*
        &suspended=(.*)\s*
        &type=(.*)\s*
        &vdomains=(.*)\s*
    $/xU', $str, $matches);
J'ai testé sur toutes les chaines de ton fichier (un bête foreach) et ça renvoit toujours un résultat de ce style :
Array
(
    [0] => paradise=bandwidth=6416.9 / 90000&creator=admin&default=paradise.power-hosting.biz&ip=127.0.0.1&list=paradise.power-hosting.biz<br>straeming.power-hosting.biz<br>team-city.power-hosting.biz<br>&pointer_paradise.power-hosting.biz=download-city.eu|&pointer_straeming.power-hosting.biz=paradise-city.fr.nf|streaming-city.fr.nf|&pointer_team-city.power-hosting.biz=team-city.fr.nf|&quota=9.48 / 4000&suspended=No&type=user&vdomains=3 / 5
    [1] => paradise
    [2] => 6416.9 / 90000
    [3] => admin
    [4] => paradise.power-hosting.biz
    [5] => 127.0.0.1
    [6] => paradise.power-hosting.biz<br>straeming.power-hosting.biz<br>team-city.power-hosting.biz<br>
    [7] => &pointer_paradise.power-hosting.biz=download-city.eu|&pointer_straeming.power-hosting.biz=paradise-city.fr.nf|streaming-city.fr.nf|&pointer_team-city.power-hosting.biz=team-city.fr.nf|
    [8] => 9.48 / 4000
    [9] => No
    [10] => user
    [11] => 3 / 5
)
S'il y a des pointeurs, ils sont à l'index 7. Si pas de pointeurs, le 7 est vide. Si tu as besoin de découper la chaine des pointeurs ou celle de list, il faudra probablement utiliser une seconde regex en plus de celle-ci.
Merci pour ta réponses donc j'ai fait comme ceci


<?php

$sock->set_method('GET');

//-- Affiche les ressources utilisé 
$sock->query('/CMD_API_ALL_USER_USAGE');
$lines = explode ("\n", $sock->fetch_body());
					 
foreach ($lines as $line)
{
   // On récupère les infos
   preg_match('/^
   ([^=]*)
   =bandwidth=(.*)\s*
   &creator=(.*)\s*
   &default=(.*)\s*
   &ip=(.*)\s*
   &list=(.*)\s*
   (&pointer_(?:.+))?
   &quota=(.*)\s*
   &suspended=(.*)\s*
   &type=(.*)\s*
   &vdomains=(.*)\s*

   $/xU', $line, $matches);
					
echo "<tr>";
echo "<td nowrap='nowrap'><img src=\"".(URL)."icones-png/user.png\" alt=\"Login\" border=\"0\" width=\"16\" height=\"16\" class=\"imgmiddle\">".$matches[1]."</td>";
echo "<td align=\"center\">".$matches[3]."</td>";
echo "<td align=\"center\"><font style=\"color: green;\">".$matches[2]."</font></td>";
echo "<td align=\"center\"><font style=\"color: green;\">".$matches[8]."</font></td>";
echo "<td align=\"center\">".$matches[11]."</td>";
echo "<td align=\"center\">".$matches[9]."</td>";
echo "<td align=\"center\">".$matches[5]."</td>";
echo "<td align=\"center\">".$matches[6]."</td>";
echo "</tr>";
}

?>


et j'ai ses erreurs


Notice: Undefined offset: 1
Notice: Undefined offset: 3
Notice: Undefined offset: 2
Notice: Undefined offset: 8
Notice: Undefined offset: 11
Notice: Undefined offset: 9
Notice: Undefined offset: 5
Notice: Undefined offset: 6
Notice: Undefined offset: 7


et pour les pointer comment les afficher vu que je met en 1 seule foreach ?
Bon, visiblement $sock->fetch_body() ne renvoit pas les lignes de CMD_API_ALL_USER_USAGE telles qu'on peut les voir en éditant directement le fichier (parce que chez moi, comme je te l'ai dit, je n'ai aucun problème en bouclant sur les lignes du fichier).

Peux-tu nous donner le résultat de :
foreach ($lines as $line) {
   echo "$line\n";
}
C'est bien ce que je pensais : ta méthode $sock->query() fait une belle soupe avec le fichier d'origine et les lignes ne ressemblent plus à rien.

Il faut donc nettoyer le bazar. Remplace ça :
$lines = explode ("\n", $sock->fetch_body());
... par ça :
$lines = preg_replace(
    array('/\n/', '/\s*([^\s=]+)=bandwidth/'),
    array('', "\n$1=bandwidth"),
    $sock->fetch_body()
);
$lines = explode("\n", $lines);
(à noter : on supprime tous les retours à la ligne contenus dans les clés et leurs valeurs)

Tu devrais (enfin) avoir le même résultat que moi Smiley smile
Donc je met comme ceci


$sock->query('/CMD_API_ALL_USER_USAGE');
$lines = preg_replace(
array('/\n/', '/\s*([^\s=]+)=bandwidth/'),
array('', "\n$1=bandwidth"),
$sock->fetch_body()
);
					
$lines = explode("\n", $lines);
					 
foreach ($lines as $line) {

echo "$line\n";

}


j'ai exactement pareil que le fichier
Modifié par staff (22 Jun 2009 - 14:11)
Pages :