Extraction de la bonne chaine

Eléphant du PHP | 66 Messages

15 oct. 2008, 16:49

Bonjour,

J'ai toujours autant de mal à utiliser les multiples fonctions de manipulations de chaine proposées par PHP...

J'ai une chaine type URL qui se compose ainsi:

Code : Tout sélectionner

http://mondomaine/index.php/decoration/list/42__air-mer-terre/1/0/0/32/0
Je souhaite extraire:

Code : Tout sélectionner

http://mondomaine/index.php/decoration/list/42__air-mer-terre
Quel est le moyen le plus adéquat?

Voilà l'algo que j'aimerais réaliser:

Code : Tout sélectionner

extrait la chaine de 0 à 1er élément "/" après la chaine "list/"
qq peut-il m'aider?
Merci!

voici ce que j'ai finalement trouvé:
$url = substr($url, 0, stripos($url, '/', stripos($url, 'list/') + 5) + 1);
si vous trouvez plus propre...

Eléphant du PHP | 136 Messages

15 oct. 2008, 17:43

ceci sera + simple
$url="http://mondomaine/index.php/decoration/ ... 1/0/0/32/0";
$url=explode("list/",$url);
$extrait=$url[1];
L'informatique apporte des solutions à des problèmes qui ne se posaient pas avant qu'elle existe.

Eléphant du PHP | 66 Messages

15 oct. 2008, 18:01

Merci mais ca ne marche pas!

Contenu du tableau après explode:

Code : Tout sélectionner

$url = Array ( [0] => http://mondomaine/index.php/decoration/ [1] => 84__vins-champagnes/1/18-20/30x40/64/0 )
ds ce cas, j'aurais souhaité récupérer "http://mondomaine/index.php/decoration/ ... hampagnes/"
Modifié en dernier par Flashball le 16 oct. 2008, 11:08, modifié 1 fois.

ViPHP
ViPHP | 4039 Messages

15 oct. 2008, 19:19

Ou simplement les expressions régulieres
(regarde des fonctions telles que preg_match() )

A la vollée, une expression telle que celle-ci devrait te trouver ce que tu veux:
$regex = "#http://[^/]+/[^/]+/[^/]+/[^/]+/[^/]+#i";
preg_match($regex,$tachaine,$matches);
print_r($matches);
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 422 Messages

15 oct. 2008, 19:38

Merci mais ca ne marche pas!
Il faudrait peut-être, de temps en temps, regarder la syntaxe des fonctions PHP et -à partir de là- essayer de trouver un moyen (je ne veux pas dire algorithme) pour répondre à la question que tu t'es posée.

Regarde comment fonctionne la fonction explode(), fais quelques essais ... et je suis sûr que tu trouveras la solution à ton problème.

Et puis, si tu veux passer de

Code : Tout sélectionner

$url = Array ( [0] => http://mondomaine/index.php/decoration/ [1] => 84__vins-champagnes/1/18-20/30x40/64/0 )
à

Code : Tout sélectionner

http://mondomaine/index.php/decoration/84__vins-champagnes/
est-ce que tu as vraiment besoin de l'aide d'un forum ?

Eléphant du PHP | 136 Messages

16 oct. 2008, 08:29

à partir d'une chaine tu demandes d'extraire ce qu'il y a au dela de "list/" et tu appliques ma formule à une chaine où "list/" ne figure pas et en plus tu veux ce qui est en deçà dans ton nouvel exemple...

Sois + clair dans tes formulations svp

sans rancune....
L'informatique apporte des solutions à des problèmes qui ne se posaient pas avant qu'elle existe.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

16 oct. 2008, 09:00

Pour obtenir : http://mondomaine/index.php/decoration/ ... -mer-terre
à partir de : http://mondomaine/index.php/decoration/ ... 1/0/0/32/0
sans utiliser les Regexp, juste avec des fonctions PHP de traitement de chaines :
function isolation_url($chaine)
{ // initialisation
  $chaine = 'http://mondomaine/index.php/decoration/list/42__air-mer-terre/1/0/0/32/0'; // si pas passée en paramètre
  $newchaine = '';

  // recherche du segment 'list/' puis découpage
  $a = strpos($chaine,'list/');
  $newchaine = substr($chaine,0,$a+5); // le +5 correspond à la longueur du segment 'list/' que l'on doit inclure
  $resteA = substr($chaine,$a+5);

  // recherche du segment suivant puis découpage
  $b = strpos($resteA,'/');
  $resteB = substr($resteA,0,$b);

  // Recollage
  $newchaine .= $resteB;

  return $newchaine;
}
ou, pour les grands malades dans mon genre :
function isolation_url($chaine)
{ return substr($chaine,0,strpos($chaine,'list/')+5).substr(substr($chaine,strpos($chaine,'list/')+5),0,strpos(substr($chaine,strpos($chaine,'list/')+5),'/'));
}
:shock: :langue:

Eléphant du PHP | 66 Messages

16 oct. 2008, 11:04

à partir d'une chaine tu demandes d'extraire ce qu'il y a au dela de "list/" et tu appliques ma formule à une chaine où "list/" ne figure pas et en plus tu veux ce qui est en deçà dans ton nouvel exemple...

Sois + clair dans tes formulations svp
J'ai été clair dès le départ sur ce que je voulais, il suffit de me lire attentivement.
Ton bout de code ne marche pas: je ne t'en veux pas et il n'y a aucune raison de se vexer!

explode extrait une chaine en utilisant un délimiteur, en l'occurence "list/" dans ton exemple, et le tableau retourné contient 2 éléments sans ce délimiteur.
est-ce que tu as vraiment besoin de l'aide d'un forum ?
J'ai d'abord simplifié mon problème avant de poster mais je précise que l'URL en question est évidemment dynamique: le bout de chaine après "/list/" varie en longueur.

J'ai trouvé une solution et j'ai édité mon 1er post dès que j'ai trouvé une solution.

Ensuite, je pense qu'il est toujours utile d'apprendre comment optimiser telle ou telle solution: je crois que c'est le cas avec la réponse de Berzemus!

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

16 oct. 2008, 11:31

J'ai trouvé une solution et j'ai édité mon 1er post dès que j'ai trouvé une solution.
Excellente initiative ! Merci. :pouce:

Toutefois, à l'édition du premier message, il vaut mieux préférer l'ajout d'un nouveau message
afin de respecter la chronologie des contributions et rendre cette solution plus visible.

Quand on a déjà lu le premier message, il est rare qu'on relise le sujet initial
supposé ne contenir qu'une question et non une réponse.

Eléphant du PHP | 66 Messages

17 oct. 2008, 12:31

Toutefois, à l'édition du premier message, il vaut mieux préférer l'ajout d'un nouveau message
afin de respecter la chronologie des contributions et rendre cette solution plus visible.
Il me semble que j'avais essayé mais que ce n'était pas possible de se répondre à soi-même - il n'y avait pas encore de réponses à ce moment là...