37

So the test case string may be:

http://example.com/?u=ben

Or

http://example.com

I'm trying to remove everything after the last occurrence of a '/' but only if it's not part of the 'http://'. Is this possible!?

I have this so far:

$url = substr($url, 0, strpos( $url, '/'));

But does not work, strips off everything after first '/'.

1
  • I don't know what you're using this for but if you're attempting to strip campaign tracking codes, the resulting URLs will usually work but not always ;-) For example, I think YouTube needs the "?" Commented Oct 3, 2013 at 20:31

4 Answers 4

123

You must use strrpos function not strpos ;-)

substr($url, 0, strrpos( $url, '/'));
Sign up to request clarification or add additional context in comments.

6 Comments

I think this is the best answer to the title of the question! I would edit the title to something like "...character in a URL" if it were not for this answer.
if no occurrence found it removes all, any modificaton for this
@mokNathal it's ugly but... substr($url,0,strrpos($url,'/') !== false ? strrpos($url,'/') : strlen($url));
slightly less ugly but fails when the needle is in the first position: substr($url,0,strrpos($url,'/') ?: strlen($url));
It should be noted that strrpos returns false if no occurrence of your needle is found. If you think that the needle may no be present, check that it exists before executing this instruction.
|
16

You should use the tool that is designed for this type of job, parse_url

url.php

<?php

$urls = array('http://example.com/foo?u=ben',
                'http://example.com/foo/bar/?u=ben',
                'http://example.com/foo/bar/baz?u=ben',
                'https://foo.example.com/foo/bar/baz?u=ben',
            );


function clean_url($url) {
    $parts = parse_url($url);
    return $parts['scheme'] . '://' . $parts['host'] . $parts['path'];
}

foreach ($urls as $url) {
    echo clean_url($url) . "\n";
}

Example:

·> php url.php                                                                                                 
http://example.com/foo
http://example.com/foo/bar/
http://example.com/foo/bar/baz
https://foo.example.com/foo/bar/baz

Comments

3

Actually, a simpler solution to what you want to achieve is to play with a few string manipulation functions of PHP.

First of all, you need to find the position of the last occurrence of the '/'. You can do this by using the strrpos() function (be careful, it is with 2 r);

Then, if you provide this position as a negative value, as a second parameter to the substr() function, it will start the search of the substring from the end.

The second problem is that you want as result the part of the strings that is at the LEFT of the last '/'. To achieve this, you will have to provide substr() with a negative value to the third parameter which will indicate how many characters you want to remove.

To be sure of how many parameters you need to remove, you will have to extract the string part at the RIGHT of the '/' first, and then count its length.

//so given this url:
$current_url = 'http://example.com/firstslug/84'

//count how long is the part to be removed
$slug_tbr = substr($current_url, strrpos($current_url, '/')); // '/84'

$slug_length = strlen(slug_tbr); // (3)

/*get the final result by giving a negative value 
to both second and third parameters of substr() */
$back_url = substr($current_url, -strrpos($current_url, '/'), -$slug_length);

//result will be http://example.com/firstslug/

Comments

0
$cutoff = explode("char", $string); 
echo $cutoff[0]; // 2 for what you want and 3 for the index

also

echo str_replace("http://", "", $str);

2 Comments

I think it should be $cutoff[1]; instead of index 0 (If i understand your script). Also, I don't undertand why you explode "char"?
"char" = "/", as for the index 0 - I wrote comments too

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.