Reputation: 1762
I'm new at regular expressions and wonder how to phrase one that collects everything after the last /.
I'm extracting an ID used by googles gdata.
my example string is http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123
Where the ID is p1f3JYcCu_cb0i0JYuCu123
Oh and I'm using PHP.
Upvotes: 78
Views: 101593
Reputation: 1081
based on @Mark Rushakoff's answer the best solution for different cases:
<?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
?>
Upvotes: 0
Reputation: 112230
This matches at least one of (anything not a slash) followed by end of the string:
[^/]+$
Notes:
+
(instead of *
) so that if the last character is a slash it fails to match (rather than matching empty string).
But, most likely a faster and simpler solution is to use your language's built-in string list processing functionality - i.e. ListLast( Text , '/' )
or equivalent function.
For PHP, the closest function is strrchr which works like this:
strrchr( Text , '/' )
This includes the slash in the results - as per Teddy's comment below, you can remove the slash with substr:
substr( strrchr( Text, '/' ), 1 );
Upvotes: 139
Reputation: 343067
you can also normal string split
$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123";
$s = explode("/",$str);
print end($s);
Upvotes: 2
Reputation: 1795
You can also get the "filename", or the last part, with the basename function.
<?php
$url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123';
echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123"
On my box I could just pass the full URL. It's possible you might need to strip off http:/
from the front.
Basename and dirname are great for moving through anything that looks like a unix filepath.
Upvotes: 13
Reputation: 655755
Generally:
/([^/]*)$
The data you want would then be the match of the first group.
Edit Since you’re using PHP, you could also use strrchr
that’s returning everything from the last occurence of a character in a string up to the end. Or you could use a combination of strrpos
and substr
, first find the position of the last occurence and then get the substring from that position up to the end. Or explode
and array_pop
, split the string at the /
and get just the last part.
Upvotes: 23
Reputation: 49043
Not a PHP programmer, but strrpos seems a more promising place to start. Find the rightmost '/', and everything past that is what you are looking for. No regex used.
Find position of last occurrence of a char in a string
Upvotes: 1
Reputation: 63529
This pattern will not capture the last slash in $0
, and it won't match anything if there's no characters after the last slash.
/(?<=\/)([^\/]+)$/
Edit: but it requires lookbehind, not supported by ECMAScript (Javascript, Actionscript), Ruby or a few other flavors. If you are using one of those flavors, you can use:
/\/([^\/]+)$/
But it will capture the last slash in $0
.
Upvotes: 2
Reputation: 7970
/^.*\/(.*)$/
^
= start of the row
.*\/
= greedy match to last occurance to / from start of the row
(.*)
= group of everything that comes after the last occurance of /
Upvotes: 11