我需要从一个字符串中删除所有不是在a-z a-z 0-9集或不是空格的字符。

有人有函数来做这个吗?


当前回答

这里有一个非常简单的正则表达式:

\W|_

并在需要时使用(使用正/斜杠分隔符)。

preg_replace("/\W|_/", '', $string);

在这里用这个伟大的工具测试它,它解释了正则表达式在做什么:

http://www.regexr.com/

其他回答

对于unicode字符,它是:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

如果你需要支持其他语言,而不是典型的A-Z语言,你可以使用以下:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);

[^\p{L}\p{N}]定义了一个否定的(它将匹配一个没有定义的字符)字符类: \p{L}:来自任何语言的信件。 \p{N}:任何脚本中的数字字符。 :空格字符。 +贪婪地匹配字符类别在1到无限次之间。

这将保存来自其他语言和脚本的字母和数字,以及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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

注意:这是一个非常古老,但仍然相关的问题。我回答这个问题纯粹是想提供一些补充信息,对将来的访问者可能有用。

正则表达式就是你的答案。

$str = preg_replace('/[^a-z\d ]/i', '', $str);

i代表不区分大小写。 ^表示,不以…开始。 \d匹配任何数字。 a-z匹配a和z之间的所有字符。由于i参数,您不必指定a-z和a-z。 \d后面有一个空格,所以这个正则表达式中允许空格。

preg_replace("/\W+/", '', $string)

你可以在这里测试:http://regexr.com/

这里有一个非常简单的正则表达式:

\W|_

并在需要时使用(使用正/斜杠分隔符)。

preg_replace("/\W|_/", '', $string);

在这里用这个伟大的工具测试它,它解释了正则表达式在做什么:

http://www.regexr.com/