I need to remove all characters from a string which aren't in a-z A-Z 0-9
set or are not spaces.
Does anyone have a function to do this?
Regular expression is your answer.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
stands for case insensitive. ^
means, does not start with. \d
matches any digit. a-z
matches all characters between a
and z
. Because of the i
parameter you don't have to specify a-z
and A-Z
. \d
there is a space, so spaces are allowed in this regex.If you need to support other languages, instead of the typical A-Z, you can use the following:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
defines a negated (It will match a character that is not defined) character class of:
\p{L}
: a letter from any language.\p{N}
: a numeric character in any script.
: a space character.+
greedily matches the character class between 1 and unlimited times.This will preserve letters and numbers from other languages and scripts as well as A-Z:
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Note: This is a very old, but still relevant question. I am answering purely to provide supplementary information that may be useful to future visitors.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
It select all not A-Z, a-z, 0-9 and delete it.
See example here: https://regexr.com/3h1rj
I was looking for the answer too and my intention was to clean every non-alpha and there shouldn't have more than one space.
So, I modified Alex's answer to this, and this is working for me
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
The regex above turned sy8ed sirajul7_islam
to sy ed sirajul islam
Explanation: regex will check NOT ANY from a to z in case insensitive way or more than one white spaces, and it will be converted to a single space.