tags:

views:

320

answers:

6

i want to match a string that can have any type of whitespace chars (specifically I am using PHP). or any way to tell if a string is empty or just has whitespace will also help!

+6  A: 

You don't need regular expressions for that, just use:

if ( Trim ( $str ) === '' ) echo 'empty string';
Jan Hančič
+1: This will be faster than compiling a regex, and more readable/maintainable.
Ben S
Thats right, but may not suit for all cases. eg. Dynamically generating pattern and using only once preg_match($pattern, $str)
eyazici
@Dominic: "Trim" works just as fine as "trim", it's just a matter of coding style :)
Jan Hančič
And (case-insensitivity aside) beginning a function with an uppercase letter is a style almost all PHP developers would avoid
Ben James
Like I said, it's a matter of style. I guess I brought that from my .NET days ...
Jan Hančič
+1  A: 
if(preg_match('^[\s]*[\s]*$', $text)) {
    echo 'Empty or full of whitespaces';
}

^[\s]* means the text must start with zero or more whitespace end [\s]*$ means must and with zero ro more whitespace, since the expressions are "zero or more", it also matches null strings. It's useess to capture whitespace filled or null strings so I didn't use matching parentheses.

eyazici
1. there's no matching parentheses in that regex. 2. there's no delimiters either. 3. you might want to explain whether this checks for an empty or a non-empty string.
nickf
I don't understand all the upvotes for this answer. It is much too verbose. The following regex does exactly the same: `^\s*$`. You don't need to put the `\s` in a character class, and don't need to add it twice. -1 from me, sorry.
Bart Kiers
When I first write, it was exactly what you say. I have changed it for clarity and nickf's explanation request.
eyazici
Well, IMO, you didn´t change it for the better.
Bart Kiers
A: 

Expression is \A\s*+\Z

yu_sha
What about `\z`? From the documentation `\Z` matches at end of string, or before newline at the end; where as `\z` matches at end of string only.
PP
+1  A: 

You don't really need a regex

if($str == '') { /* empty string */ }
elseif(trim($str) == '') { /* string of whitespace */ }
else { /* string of non-whitespace */ }
Rob
+3  A: 
if (preg_match('^[\s]*$', $text)) {
    //empty
} 
else {
    //has stuff
}

but you can also do

if ( trim($text) === '' ) {
    //empty
}

Edit: updated regex to match a truly empty string - per nickf (thanks!)

Jared
The first one fails on, ironically, an empty string. Change to a * match and add some delimiters and you're right.
nickf
+4  A: 

Checking the length of the trimmed string, or comparing the trimmed string to an empty string is probably the fastest and easiest to read, but there are some cases where you can't use that (for example, when using a framework for validation which only takes a regex).

Since no one else has actually posted a working regex yet...

if (preg_match('/\S/', $text)) {
    // string has non-whitespace
}

or

if (preg_match('/^\s*$/', $text)) {
    // string is empty or has only whitespace
}
nickf