2009-10-09 14 views
0

Si je l'adresse suivante:isoler une partie d'une URL avec php

http://URL/products/38/293/bannana_cake/ 

ou

htp://URL/products/38/293/fruit_cake/ 

Comment puis-je isoler juste bannana_cake et fruit_cake des exemples ci-dessus?

+0

essayez d'utiliser REGEX. –

Répondre

3
<?php 
$url = 'http://username:[email protected]/path?arg=value#anchor';  
print_r(parse_url($url));  
echo parse_url($url, PHP_URL_PATH); 
?> 

Ensuite, utilisez explode() sur l'élément 'path'. Par exemple:

<?php 
$url = 'http://URL/products/38/293/bannana%5Fcake/'; 
$a = parse_url($url); 
$p = explode('/', $a['path']); 
echo $p[4]; 
?> 
+0

ne serait-ce pas simplement isoler tout à droite de l'URL? –

+0

J'ai ajouté la fonctionnalité d'éclatement. –

0

ce sera une variable $ _GET comme ce que vous cherchez à est juste une version mod_rewrite d'une chaîne de requête

essayer cela pour voir ce que le nom de la variable est:

<pre> 
<?php print_r($_GET);?> 
</pre> 
+0

pas nécessairement $ _GET, pourrait être dans $ _SERVER ['PATH_INFO'] en fonction de la configuration de réécriture –

0

Vous pouvez voir l'URL qui a été demandé en regardant le tableau $ _SERVER [] (Google que, pour trouver l'entrée exacte). Ils vous pouvez diviser la chaîne en un tableau sur '/', puis l'index [3] sera la partie de l'URL qui vous intéresse.

+0

Un exemple serait sympa de montrer exactement comment couper en tranches la chaîne et ainsi de suite. – Caffeine

0

Diviser l'URL sur les barres obliques et récupérer la dernière partie:

$parts = explode('/', $url); 
echo $parts[sizeof($parts) - 2]; 

Seul problème, vous devez avoir le slash final dans l'URL. Vous pouvez faire un chèque pour cela comme ceci:

$parts = explode('/', $url); 
echo ($parts[sizeof($parts) - 1]) 
    ? $parts[sizeof($parts) - 1] 
    : $parts[sizeof($parts) - 2]; 
1

Probablement la meilleure façon, qui ne vaut que pour votre cas particulier et n'est pas quelque chose pour la production, est d'utiliser le basename-function:

<?php 
echo basename("http://url/products/38/293/banana_cake/"); // Produces "banana_cake" 
?> 

Cette ne fonctionne que parce que "banana_cake" est la dernière partie de l'URL et qu'il n'y a rien derrière la dernière barre.

Ce n'est certainement pas une solution souhaitable et la réponse de Luca Matteis obtiendra mon vote, parce que le moindre changement dans l'ordre de la chaîne de requête cassera les choses.

0

Ma réponse sera un peu plus longue. Il semble que vous voulez faire quelque chose de similaire à l'utilisation de URI Templates, donc voici un extrait de deux fonctions d'une classe (appelée xs_Breakdown) que j'ai qui fait ces choses. Il pourrait facilement être étendu pour inclure des caractères génériques et un comportement conditionnel (sur la liste de tâches pour un moment dans le futur, je souffre de trop peu à faire). Premièrement, et exemple de mise en place et d'utilisation;

$br = new xs_Breakdown ('{first}/{second}/{third}/{fourth}/{fifth}/{andsoon}') ; 

    // Pick out the template variable called 'third' 
    $third = $br->third ; 

Le code (juste l'essentiel qui devrait être suffisant pour lancer une partie de votre propre poussière, tout le code serait trop long ici pour poster un message me Pop si vous souhaitez tout le tralala avec. trois classes imbriquées/Java Bean-like);

// Static variable to hold our tokens 
$_tokens = null ; 

// Input path (set in constructor) 
$_path = null ; 

// Results here 
$values = array() ; 

function parse ($schema = '') { 

      // Sanitize input data : Regular Expression 
      $regexp = '/[^a-z0-9 +\-\/!$*_=|.:]/i' ; 

      // Break our path into little bits 
      $break = explode ('/', $this->_path) ; 

      // Find the tokens used from our schema template 
      $this->_tokens = $this->getSubStrs ("{","}", $schema) ; 

      // Loop through the path elements 
      foreach ($break as $key => $value) { 

       // Sanitize the value of the element 
       $value = urldecode (trim (preg_replace ($regexp, '', $value))) ; 

       // Element not blank? (Meaning, real text) 
       if ($value != '') 

        // Index it! 
        @$this->values[$this->_tokens[$key]] = $value ; 

      } 

     } 

     function getSubStrs ($from, $to, $str, &$result = array()) { 

      if (strpos ($str, $from) !== false) { 

       $start = strpos ($str, $from) + 1 ; 
       $end = strpos ($str, $to) - 1 ; 

       $item = substr ($str, $start, $end - $start + 1) ; 
       $rest = substr ($str, $end + 2) ; 

       $result[] = $item ; 

       $this->getSubStrs ($from, $to, $rest, $result) ; 

      } 

      return $result ; 
     } 
Questions connexes