如何删除非字母数字字符?

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

有人有函数来做这个吗?

278303 次浏览

听起来好像你已经知道你想做什么了,你基本上把它定义为一个正则表达式。

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

正则表达式是你的答案。

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • i代表不区分大小写。
  • ^表示,不以。
  • \d匹配任何数字。
  • a-z匹配az之间的所有字符。由于i参数,你不必指定a-zA-Z
  • \d后面有一个空格,所以在这个正则表达式中允许有空格。

对于unicode字符,它是:

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

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

\W|_

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

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

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

http://www.regexr.com/

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

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

[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

它会选择所有非A-Z, A-Z, 0-9,然后删除它。

参见示例:https://regexr.com/3h1rj

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

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]定义了以下字符类的否定(它将匹配定义的字符):
    • \p{L}:来自任何语言的字母。
    • \p{N}: 任何脚本中的数字字符。
    • :空格字符。
    • 李< / ul > < / >
    • + 贪婪地匹配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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
    

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