Récupérer les caractères après la dernière / dans l'URL

Réponses:

265

Très simplement:

$id = substr($url, strrpos($url, '/') + 1);

strrpos obtient la position de la dernière occurrence de la barre oblique; substr renvoie tout après cette position.


Comme mentionné par redanimalwar s'il n'y a pas de barre oblique, cela ne fonctionne pas correctement car strrposrenvoie false. Voici une version plus robuste:

$pos = strrpos($url, '/');
$id = $pos === false ? $url : substr($url, $pos + 1);
Chèvre mécontente
la source
Cela coupe le premier caractère s'il n'y a pas de barre oblique du tout.
redanimalwar
@redanimalwar J'ai ajouté une autre solution
DisgruntledGoat
9
Je me demande pourquoi le $str = basename($url)ne reçoit pas plus de votes positifs, fonctionne parfaitement bien pour moi.
redanimalwar
2
@redanimalwar (1) basename est destiné aux chemins de fichiers, pas aux URL - je pense qu'il renverra toujours le même résultat, mais il peut y avoir des cas extrêmes comme des barres obliques inverses; (2) basename ne fonctionne que pour les barres obliques alors que ma réponse peut être facilement modifiée si quelqu'un d'autre veut faire la même chose avec un caractère différent.
DisgruntledGoat
Merci. Simple et pratique !!
Rodrigo Zuluaga le
51
$str = basename($url);
GZipp
la source
1
Cela fonctionne-t-il sur les URL? Le nom de base n'est-il pas destiné aux chemins de fichiers?
random_user_name
2
Semble fonctionner correctement, c'est une fonction de chaîne; il ne vérifie pas si le chemin existe.
Gifford N.
14

Vous pouvez exploser en fonction de "/" et renvoyer la dernière entrée:

print end( explode( "/", "http://www.vimeo.com/1234567" ) );

Cela est basé sur la séparation de la chaîne, ce qui n'est pas nécessaire si vous savez que le motif de la chaîne elle-même ne changera pas de sitôt. Vous pouvez également utiliser une expression régulière pour localiser cette valeur à la fin de la chaîne:

$url = "http://www.vimeo.com/1234567";

if ( preg_match( "/\d+$/", $url, $matches ) ) {
    print $matches[0];
}
Sampson
la source
explodeme semble toujours plus au-dessus de la tête, même si je ne l'ai jamais chronométré pour voir à quelle vitesse il est.
DisgruntledGoat
Il semble qu'explode () soit un peu plus lent. Sur 10 000 instances, il s'agit du temps nécessaire pour les deux. substr () first: 0.013657 / 0.045038
Sampson
Peut-être plus lent, mais je préfère l'explosion ici. Plus précisément, si l'url ne contient aucun "/", le +1 dans la réponse strrpos fait exploser un désordre est capable de surmonter.
Noam
1
L'exemple jette un avis et devrait définitivement être retravaillé.
Xatenev
Oui, les données éclatées doivent être une variable
ymakux
11

Vous pouvez utiliser substret strrchr:

$url = 'http://www.vimeo.com/1234567';
$str = substr(strrchr($url, '/'), 1);
echo $str;      // Output: 1234567
Gabriel
la source
Plus comme ceci: ltrim (strrchr ($ url, "/"), "/"); strchr retourne une chaîne, pas un nombre
Denis Chenu
8
$str = "http://www.vimeo.com/1234567";
$s = explode("/",$str);
print end($s);
ghostdog74
la source
3
ma version, bien que le résultat final soit le même que celui affiché, permet à OP d'utiliser les autres éléments de la chaîne fractionnée s'il le souhaite.
ghostdog74
c'est la bonne réponse, puisque le titre demande après 'dernier' / dans l'url
Fabiano Shark
1

array_pop(explode("/", "http://vimeo.com/1234567")); renverra le dernier élément de l'exemple d'url

nikc.org
la source
dans php7 avis Retours: PHP Notice: Only variables should be passed by reference.
billynoah
0

Two one liners - Je soupçonne que le premier est plus rapide mais le second est plus joli et différent end()et array_pop(), vous pouvez passer le résultat d'une fonction directement à current()sans générer de notification ou d'avertissement car il ne déplace pas le pointeur ou ne modifie pas le tableau.

$var = 'http://www.vimeo.com/1234567';

// VERSION 1 - one liner simmilar to DisgruntledGoat's answer above
echo substr($a,(strrpos($var,'/') !== false ? strrpos($var,'/') + 1 : 0));

// VERSION 2 - explode, reverse the array, get the first index.
echo current(array_reverse(explode('/',$var)));
Billynoah
la source
@redburn, l'utilisation de end()cette façon dans php 5.4+ et plus jettera un avis. Selon la documentation: " vous devez lui passer une variable réelle et non une fonction renvoyant un tableau car seules les variables réelles peuvent être passées par référence. ".
billynoah
-1

Voici une belle fonction dynamique que j'ai écrite pour supprimer la dernière partie de l'url ou du chemin.

/**
 * remove the last directories
 *
 * @param $path the path
 * @param $level number of directories to remove
 *
 * @return string
 */
private function removeLastDir($path, $level)
{
    if(is_int($level) && $level > 0){
        $path = preg_replace('#\/[^/]*$#', '', $path);
        return $this->removeLastDir($path, (int) $level - 1);
    }
    return $path;
}
Mahmoud Zalt
la source