听起来您几乎已经知道自己想要做什么,您基本上将其定义为正则表达式。
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
对于 unicode 字符,它是:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
包括 \d
,因此 \d
是不必要的。此外,这是错误的,因为它还会在结果字符串中留下下划线(也包含在 \w
中)。
[:alnum:]
已经涵盖了这两种情况,这里真的需要 i
标志吗?
Regular expression 是您的答案。
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i 代表不区分大小写。
^ 表示,不以开头。
\d 匹配任何数字。
az 匹配 a 和 z 之间的所有字符。由于 i 参数,您不必指定 az 和 AZ。
\d 之后有一个空格,因此此正则表达式中允许有空格。
如果您需要支持其他语言,而不是典型的 AZ,您可以使用以下内容:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ] 定义了一个否定(它将匹配未定义的字符)字符类: \p{L}:来自任何语言的字母。 \p{N}:任何脚本中的数字字符。 : 一个空格字符。
\p{L}:任何语言的字母。
\p{N}:任何脚本中的数字字符。
: 一个空格字符。
+ 贪婪地匹配 1 到无限次之间的字符类。
这将保留来自其他语言和脚本以及 AZ 的字母和数字:
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
注意:这是一个非常古老但仍然相关的问题。我回答纯粹是为了提供可能对未来访问者有用的补充信息。
u
标志,对我有用 - /[^\p{L}\p{N} ]+/u
这是一个非常简单的正则表达式:
\W|_
并根据需要使用(使用正向 /
斜杠分隔符)。
preg_replace("/\W|_/", '', $string);
使用这个解释正则表达式在做什么的好工具在这里测试它:
/u
标志,否则非 ascii 字母也会被删除。
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
它选择所有非 AZ、az、0-9 并将其删除。
请参阅此处的示例:https://regexr.com/3h1rj
\W
是字符 A-Za-z0-9_
的 \w
的倒数。所以 \W
将匹配任何不是 A-Za-z0-9_
的字符并将它们删除。 []
是 character set boundary。 +
在字符集边界上是多余的,但通常表示 1 个或多个字符。 u
标志将表达式扩展为包括 unicode 字符支持,这意味着它不会删除字符代码 255 以外的字符,例如 ª²³µ
。使用 unicode 和 ascii 字符的各种用法示例 3v4l.org/hSVV5。
preg_replace('/[^A-Za-z0-9 ]/', '', $string);