Answers:
听起来您几乎已经知道自己想做的事情,基本上将其定义为正则表达式。
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
对于unicode字符,它是:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
包括\d
,所以\d
是不必要的。此外,这是错误的,因为它还会在结果字符串(也包含在中\w
)中留下下划线。
i
标志真的有必要在这里,因为[:alnum:]
已经涵盖了这两种情况?
正则表达式是您的答案。
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
代表不区分大小写。^
表示,不以。 \d
匹配任何数字。 a-z
匹配a
和之间的所有字符z
。由于i
有了参数,您不必指定a-z
和A-Z
。\d
有一个空格,因此此正则表达式中允许使用空格。这是一个非常简单的正则表达式:
\W|_
并根据需要使用(带有正/
斜杠定界符)。
preg_replace("/\W|_/", '', $string);
在这里使用此强大的工具进行测试,该工具可以解释正则表达式的功能:
/u
标记,否则非ASCII字母也将被删除。
如果需要支持其他语言,而不是典型的可用区,则可以使用以下语言:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
注意:这是一个非常古老但仍然相关的问题。我的回答纯粹是为了提供可能对将来的访问者有用的补充信息。
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
它选择所有非AZ,az,0-9并将其删除。
在此处查看示例:https://regexr.com/3h1rj
\W
是\w
字符的逆A-Za-z0-9_
。因此,\W
将匹配不存在的任何字符A-Za-z0-9_
并将其删除。该[]
是字符集的边界。的+
是一个字符集的边界上多余的,但通常是指1个或多个字符。该u
标志扩展了表达式以包括unicode字符支持,这意味着它不会删除字符代码255之类的字符ª²³µ
。具有unicode和ascii字符的各种用法示例3v4l.org/hSVV5。
preg_replace("/\W+/", '', $string)
您可以在这里进行测试:http : //regexr.com/
您可以将字符串拆分为字符并进行过滤。
<?php
function filter_alphanum($string) {
$characters = str_split($string);
$alphaNumeric = array_filter($characters,"ctype_alnum");
return join($alphaNumeric);
}
$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123
?>