how to remove first word from a php string
Asked Answered
S

7

25

I'd like to remove the first word from a string using PHP. Tried searching but couldn't find an answer that I could make sense of.

eg: "White Tank Top" so it becomes "Tank Top"

Salesgirl answered 25/7, 2011 at 22:26 Comment(0)
E
66

No need for explode or array manipulation, you can use function strstr:

echo strstr("White Tank Top"," ");
//Tank Top

UPDATE: Thanks to @Sid To remove the extra white space you can do:

echo substr(strstr("White Tank Top"," "), 1);
Endocrinology answered 25/7, 2011 at 22:32 Comment(6)
This is better than the array manipulation answers, however this will leave the space character too. This can be cut out by doing echo substr(strstr("White Tank Top"," "), 1);Kerrison
+1 for simplicity, I keep forgetting about strtr. Was about to type out 3 lines using strpos + substr when I saw your answer. Add an ltrim in case there are multiple spaces and you're golden.Sunnysunproof
@Kerrison white space at the beginning you mean? i just gave it a check and it worked fine for me can you verify?Endocrinology
@Fanis i totally get you, with so many different functions for string manipulation in php is easy to forget.Endocrinology
@Endocrinology like @Kerrison said it will include the space it's matching on. You won't see it easily by echoing out on a web page but do a strlen or run it in a debugger and you'll spot it :)Sunnysunproof
@Kerrison @Fanis strlen showed the white space interesting, added your solution to the answer thanks!Endocrinology
C
9

You can use the preg_replace function with the regex ^(\w+\s) that will match the first word of a string per se:

$str = "White Tank Top";
$str = preg_replace("/^(\w+\s)/", "", $str);
var_dump($str); // -> string(8) "Tank Top"
Clannish answered 27/5, 2016 at 8:38 Comment(0)
E
3
function remove_word($sentence)
{
 $words=array_shift(explode(' ', $sentence));
 return implode(' ', $words);
}

?

Este answered 25/7, 2011 at 22:30 Comment(5)
could you also condense that down into return implode(' ', array_shift(explode(' ', $sentence)));? i was never quite sure with php.Minoan
This solution is a memory hog. If the string has lots of spaces the arrays will become large. amosrivera's solution is much better (though not quite complete as it leaves the space character too).Kerrison
@Patrick Perini: no - array_shift() returns the first element in the array - not the modified arrayEste
@Sid: first, amosrivera's answer is semantically different (consider what happens with a string containing no spaces) also I would hardly call this a memory hog - I would expect it to use more memory than amosrivera's answer - but without testing each method I can't tell which has a bigger effective footprint on the system.Este
Hog or not, this answer is missing an explanation. The point is, your snippet performs too many explosions. Please see my limited explosion.Livvie
S
1
$string = 'White Tank Top';

$split = explode(' ', $string);
if (count($split) === 1) {
    // do you still want to drop the first word even if string only contains 1 word?
    // also string might be empty
} else {
    // remove first word
    unset($split[0]);
    print(implode(' ', $split));
}
Stacte answered 25/7, 2011 at 22:31 Comment(0)
L
0
function remove_word($sentence)
{
    $exp = explode(' ', $sentence);
    $removed_words = array_shift($exp);
    if(count($exp)>1){
        $w = implode(' ', $exp);
    }else{
        $w = $exp[0];
    }
    return $w;
}

Try this function i hope it's work for you .

Lukewarm answered 11/2, 2015 at 10:5 Comment(0)
L
0

Make sure that you opt for an approach which will appropriately handle an empty string, a lone word (with no spaces), and multiple words.

I personally would use preg_replace() because it is most direct.

For your consideration: (Demo)

function substrStrpos($text) {
    return substr($text, 1 + (strpos($text, ' ') ?: -1));
}

function explodeSlice($text) {
    $explodeOnce = explode(' ', $text, 2);
    return array_pop($explodeOnce);
}

function substrStrstr($text) {
    return substr(strstr($text, " "), 1);
}

function ltrimStrstr($text) {
    return ltrim(strstr($text, " "));
}

function pregReplace($text) {
    return preg_replace('~^\S+\s*~', '', $text);
}

Tests and expected results:

$tests = [
    '' => '',
    'White' => '',
    'White Tank' => 'Tank',
    'White Tank Top' => 'Tank Top',
];

Outcomes:

|   func \ tests|  [empty]  |  White  |  White Tank  |  White Tank Top  |
------------------------------------------------------------------------
|   substrStrpos|    ✅    |    💩   |      ✅      |        ✅       |
------------------------------------------------------------------------
|   explodeSlice|    ✅    |    💩   |      ✅      |        ✅       |
------------------------------------------------------------------------
|   substrStrstr|    ✅    |    ✅   |      ✅      |        ✅       |
------------------------------------------------------------------------
|    ltrimStrstr|    ✅    |    ✅   |      ✅      |        ✅       |
------------------------------------------------------------------------
|    pregReplace|    ✅    |    ✅   |      ✅      |        ✅       |

Note that substrStrpos('White') and explodeSlice('White') will both return White.

Livvie answered 15/4, 2024 at 23:59 Comment(0)
L
-3

If you are not guaranteed to have a space in your string, be careful to choose a technique that won't fail on such cases.

If using explode() be sure to limit the explosions for best efficiency.

Demonstration:

$strings = ["White", "White Tank", "White Tank Top"];
foreach ($strings as $string) {
    echo "\n{$string}:";
    echo "\n-\t" , substr($string, 1 + (strpos($string, ' ') ?: -1));

    $explodeOnce = explode(' ', $string, 2);
    echo "\n-\t" , end($explodeOnce);              

    echo "\n-\t" , substr(strstr($string, " "), 1);

    echo "\n-\t" , ltrim(strstr($string, " "));

    echo "\n-\t" , preg_replace('~^\S+\s~', '', $string);
}

Output:

White:
-   White
-   White
-                       // strstr() returned false
-                       // strstr() returned false  
-   White
White Tank:
-   Tank
-   Tank
-   Tank
-   Tank
-   Tank
White Tank Top:
-   Tank Top
-   Tank Top
-   Tank Top
-   Tank Top
-   Tank Top

My preference is the regex technique because it is stable in all cases above and is a single function call. Note that there is no need for a capture group because the fullstring match is being replaced. ^ matches the start of the string, \S+ matches one or more non-whitespace characters and \s matches one whitespace character.

Livvie answered 21/11, 2019 at 10:4 Comment(3)
This answer might be easier to quickly understand if it more clearly paired possible solutions with their output without the need to count lines. This would also more separate the solutions that do not work properly from those that do. Your suggested solution is also last among the examples, potentially increasing the amount of re-reading required to understand the suggestion. It is also possible that researchers skimming the page for a quick solution see a bunch of text and a large code block without a clearly highlighted solution, and decide to go with one of the simpler-looking answers.Occultation
Fair enough, I'll rework it. (Or I authorise you, @RyanM, to euthanize it, then I'll post a new answer. There is no way that I am going to earn the "badge of shame" on Stack Overflow.)Livvie
@RyanM Please delete this answer.Livvie

© 2022 - 2025 — McMap. All rights reserved.