PHP check if string contains space between words (not at beginning or end)

38,222

Solution 1

You can verify that the trimmed string is equal to the original string and then use strpos or str_contains to find a space.

// PHP < 8
if ($str == trim($str) && strpos($str, ' ') !== false) {
    echo 'has spaces, but not at beginning or end';
}

// PHP 8+
if ($str == trim($str) && str_contains($str, ' ')) {
    echo 'has spaces, but not at beginning or end';
}

Some more info if you're interested

If you use strpos(), in this case, you don't have to use the strict comparison to false that's usually necessary when checking for a substring that way. That comparison is usually needed because if the string starts with the substring, strpos() will return 0, which evaluates as false.

Here it is impossible for strpos() to return 0, because the initial comparison
$str == trim($str) eliminates the possibility that the string starts with a space, so you can also use this if you like:

if ($str == trim($str) && strpos($str, ' ')) { ...

If you want to use a regular expression, you can use this to check specifically for space characters:

if (preg_match('/^[^ ].* .*[^ ]$/', $str) { ...

Or this to check for any whitespace characters:

if (preg_match('/^\S.*\s.*\S$/', $str) { ...

I did some simple testing (just timing repeated execution of this code fragment) and the trim/strpos solution was about twice as fast as the preg_match solution, but I'm no regex master, so it's certainly possible that the expression could be optimized to improve the performance.

Solution 2

If your string is at least two character long, you could use:

if (preg_match('/^\S.*\S$/', $str)) {
    echo "begins and ends with character other than space";
} else {
    echo "begins or ends with space";
}

Where \S stands for any character that is not a space.

Share:
38,222
Eddy Unruh
Author by

Eddy Unruh

I code for money and TP

Updated on January 08, 2022

Comments

  • Eddy Unruh
    Eddy Unruh over 2 years

    I need to check if a string contains a space between words, but not at beginning or end. Let's say there are these strings:

    1: "how r u ";
    2: "how r u";
    3: " howru";
    

    Then only 2 should be true. How could I do that?

  • heximal
    heximal almost 8 years
    strpos(trim($str), ' ') !== false must be
  • clemens321
    clemens321 almost 8 years
    @heximal That would result in 1 from example above be true (and my answer to the caption), but if only 2 should be true the answer is right.
  • heximal
    heximal almost 8 years
    yes, you're right) by default the rest of expressions are not calculated if the previous fails.
  • jjoselon
    jjoselon over 5 years
    a cycle does not give the performance, what does it happened if $word is too long ?