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);

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);

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];
}

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

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);

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


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)));

@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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.