web-dev-qa-db-fra.com

Expression régulière pour tout collecter après le dernier /

Je suis nouveau dans les expressions régulières et je me demande comment formuler une phrase qui collecte tout après le dernier /.

J'extrais un identifiant utilisé par GData de Google.

ma chaîne d'exemple est 

http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123

Où l'ID est: p1f3JYcCu_cb0i0JYuCu123

Oh, et j'utilise PHP.

47
Hellonearthis

Cela correspond à au moins un de (quoi que ce ne soit pas une barre oblique) suivi de la fin de la chaîne:

[^/]+$


Remarques:

  • Pas de parenthèse car aucun groupe n'est nécessaire - le résultat est classé dans le groupe 0 (la correspondance elle-même).
  • Utilise + (au lieu de *) de sorte que si le dernier caractère est une barre oblique, il ne correspond pas (plutôt qu'une chaîne vide correspondante).


Mais, probablement une solution plus rapide et plus simple consiste à utiliser la fonctionnalité de traitement de liste de chaînes intégrée à votre langue - à savoir ListLast( Text , '/' ) ou une fonction équivalente.

Pour PHP, la fonction la plus proche est strrchr qui fonctionne comme ceci:

strrchr( Text , '/' )

Cela inclut la barre oblique dans les résultats - selon le commentaire de Teddy ci-dessous, vous pouvez supprimer la barre oblique avec substr :

substr( strrchr( Text, '/' ), 1 );
98
Peter Boughton

Généralement:

/([^/]*)$

Les données que vous voulez seraient alors la correspondance du premier groupe.


Edit Puisque vous utilisez PHP, vous pouvez aussi utiliser strrchr qui renvoie tout depuis la dernière occurrence d’un caractère dans une chaîne jusqu’à la fin. Ou vous pouvez utiliser une combinaison de strrpos et substr , commencez par trouver la position de la dernière occurrence, puis récupérez la sous-chaîne de cette position jusqu'à la fin. Ou explode et array_pop , divisez la chaîne au / et obtenez uniquement la dernière partie.

18
Gumbo

Vous pouvez également obtenir le "nom de fichier", ou la dernière partie, avec la fonction basename .

<?php
$url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123';

echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123"

Sur ma boîte, je pourrais simplement passer l'URL complète. Il est possible que vous deviez supprimer le code http:/ de l'avant.

Basename et dirname sont parfaits pour déplacer tout ce qui ressemble à un chemin de fichier Unix.

12
James Socol
/^.*\/(.*)$/

^ = début de la ligne

.*\/ = match gourmand jusqu'à la dernière occurrence depuis/vers le début de la ligne

(.*) = groupe de tout ce qui vient après la dernière occurrence de /

7
rasjani

vous pouvez également diviser une chaîne normale

$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123";
$s = explode("/",$str);
print end($s);
3
ghostdog74

Ce modèle ne capture pas la dernière barre oblique dans $0 et ne correspond à rien s'il n'y a pas de caractères après la dernière barre oblique.

/(?<=\/)([^\/]+)$/

Edit: mais il faut regarder, non pris en charge par ECMAScript (Javascript, Actionscript), Ruby ou quelques autres versions Si vous utilisez l'une de ces variantes, vous pouvez utiliser:

/\/([^\/]+)$/

Mais il [ capturera la dernière barre oblique dans $0.

2
eyelidlessness

Pas un programmeur PHP, mais strrpos semble un endroit plus prometteur pour commencer. Trouvez le "/" le plus à droite, et tout ce qui est passé correspond à ce que vous recherchez. Pas de regex utilisé.

Trouver la position de la dernière occurrence d'un caractère dans une chaîne

1
hughdbrown

sur la base de @ Mark Rushakoff , la meilleure solution pour différents cas:

<?php
$path = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123?var1&var2#hash";
$vars =strrchr($path, "?"); // ?asd=qwe&stuff#hash
var_dump(preg_replace('/'. preg_quote($vars, '/') . '$/', '', basename($path))); // test.png
?>
  1. Expression régulière pour tout collecter après le dernier/
  2. Comment obtenir le nom du fichier du chemin complet avec PHP?
0
eapo