PHP remove characters after last occurrence of a character in a string

38,302

Solution 1

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

Solution 2

You must use strrpos function not strpos ;-)

substr($url, 0, strrpos( $url, '/'));

Solution 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/
Share:
38,302
benhowdle89
Author by

benhowdle89

Consultant software engineer and advisor to companies building software products.

Updated on April 05, 2020

Comments

  • benhowdle89
    benhowdle89 about 4 years

    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 '/'.