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.
Cela correspond à au moins un de (quoi que ce ne soit pas une barre oblique) suivi de la fin de la chaîne:
[^/]+$
Remarques:
+
(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 );
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.
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.
/^.*\/(.*)$/
^
= 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 /
vous pouvez également diviser une chaîne normale
$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123";
$s = explode("/",$str);
print end($s);
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
.
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
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
?>