How to check if there are only spaces in string in PHP?
Solution 1
mb_language('uni');
mb_internal_encoding('UTF-8');
$s = ' ';
if (strlen(preg_replace('/\s+/u','',$s)) == 0) {
echo "String is empty.\n";
}
If that doesn't work i suggest doing this
$s = ' ';
if (strlen(trim(preg_replace('/\xc2\xa0/',' ',$s))) == 0) {
echo "String is empty.\n";
}
These solutions have been tested on different platforms.
The u flag tells preg_replace() to treat the string as a multibyte string, namely utf-8
The character is a nonbreaking space C2A0 and can be generated with alt+0160.
Solution 2
Maybe you are doing something else that is messing up the results? Your test do returns 0
print_r(strlen(trim(' ')));
And that's the expected behavior of trim.
This function returns a string with whitespace stripped from the beginning and end of str . Without the second parameter, trim() will strip these characters:
- " " (ASCII 32 (0x20)), an ordinary space.
- "\t" (ASCII 9 (0x09)), a tab.
- "\n" (ASCII 10 (0x0A)), a new line (line feed).
- "\r" (ASCII 13 (0x0D)), a carriage return.
- "\0" (ASCII 0 (0x00)), the NUL-byte.
- "\x0B" (ASCII 11 (0x0B)), a vertical tab.
UPDATE:
Looking at your attached code i noticed you have an extra character between 2 spaces.
This is the output of hexdump -C
$ hexdump -C space.php
00000000 3c 3f 0d 0a 70 72 69 6e 74 5f 72 28 73 74 72 6c |<?..print_r(strl|
00000010 65 6e 28 74 72 69 6d 28 27 20 c2 a0 20 27 29 29 |en(trim(' .. '))|
00000020 29 3b 0d 0a 3f 3e |);..?>|
00000026
And this is the output of od, with just that character in the file.
$ od space.php
0000000 120302
0000002
trim won't delete that space, because.. well, it's not a space. This is a good reference on how to spot unusual characters.
Oh, and to answer your updated question, just use empty as Peter said.
Solution 3
I think the fastest way is to trim leading spaces (ltrim
will fail fast if there are other characters) and compare the result to the empty string:
# Check if string consists of only spaces
if (ltrim($string, ' ') === '') {
Solution 4
A simple preg_match() would suffice:
if(preg_match('/^\s+$/', $str)) == 1){
die('there are only spaces!');
}
Bruce Dou
Updated on July 19, 2022Comments
-
Bruce Dou almost 2 years
print_r(strlen(trim(' ')));
the result is 9
I also tried
preg_replace('/[\n\r\t\s]/', '', ' ')
but the result is not zero.
Please download my code and you will get the result
-
Peter Lindqvist over 14 yearsI cannot get the empty statement to run, what's the deal with that?
-
Peter Lindqvist over 14 yearsAh, you have to assign the trimmed string to a variable before using empty.
-
Bruce Dou over 14 yearsCan you download my code and check the space, i think it is not normal space.
-
Gumbo over 14 yearsNote that
empty
also returns true for"0"
. -
Peter Lindqvist over 14 yearsYou may need to specify the internal encoding.
-
Erlock over 14 yearsBeware to empty(): empty('0') returns True as well!
-
Peter Lindqvist over 14 yearsthere was one non breaking space in your code, but the preg_replace would convert them all to regular space and then trim can take care of it.