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


349

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

有人有功能吗?

Answers:


695

听起来您几乎已经知道自己想做的事情,基本上将其定义为正则表达式。

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

8
zuk1:regexbuddy对此提供了极大的帮助
Relipse

2
如果要将连字符作为允许的字符包含在此处,请参见以下示例。我需要这个是因为我需要根据电子邮件地址从Moodle用户名中删除不允许的字符:preg_replace(“ / [^ a-z0-9 _。@ \-] /”,'',$ string);
伊万·多诺万

2
对于正则表达式周围的撇号(单引号),而不是引号(双引号),此功能是否完全相同?例如:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
1540625年

3
我们想要对此进行解释:)。人们来这里看看为什么会这样。也请考虑正则表达式的解释!谢谢
Pratik

1
如果我们想保留强调的字符怎么办?
wonzbak

169

对于unicode字符,它是:

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

嗨,voondo,/ ui东西是什么..你叫它什么?谁能给我一些启示。谢谢。
kebyang

4
为了澄清起见,它们被称为标志。将它们放在结束定界符之后(在本例中为“ /”,但可以是“〜”或“ @”,也可以是您想要使用的任何字符,只要开始定界符和结束定界符相同即可)并更改表达式的行为。
Doktor J 2014年

1
顺便说一句,\w包括\d,所以\d是不必要的。此外,这是错误的,因为它还会在结果字符串(也包含在中\w)中留下下划线。
smathy

2
仍然存在错误,字符类需要以':]'终止,所以正确的行应为:preg_replace(“ / [^ [:alnum:] [:space:]] / ui”,'', $ string);
h00ligan 2014年

4
i标志真的有必要在这里,因为[:alnum:]已经涵盖了这两种情况?
billynoah

50

正则表达式是您的答案。

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

3
我们想要对此进行解释:)。人们来这里看看为什么会这样。也请考虑正则表达式的解释!不是每个人都有足够的能力来知道您在这里写的内容而没有解释。谢谢
Pratik

@PratikCJoshi我代表不区分大小写。^表示不以开头。\ d匹配任何数字。az匹配a和z之间的所有字符。由于有了i参数,您不必指定z和AZ。在\ d之后有一个空格,因此该正则表达式中允许使用空格。
巴特

1
人们不会读评论作为答案。请更新答案!
Pratik

18

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

\W|_

并根据需要使用(带有正/斜杠定界符)。

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

在这里使用此强大的工具进行测试,该工具可以解释正则表达式的功能:

http://www.regexr.com/


1
您仍然需要/u标记,否则非ASCII字母也将被删除。
Xeoncross 2014年

整洁,但也可以匹配空格,如果需要,可以使用字符类一个或多个附加量词来使性能提高一倍 [\W_]+
泡泡泡泡

18

如果需要支持其他语言,而不是典型的可用区,则可以使用以下语言:

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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

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


8
[\W_]+

 

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

它选择所有非AZ,az,0-9并将其删除。

在此处查看示例:https//regexr.com/3h1rj


1
这个正则表达式/ [\ W _] + / u是什么意思?
安吉洛Rigo旅馆

\W\w字符的逆A-Za-z0-9_。因此,\W将匹配不存在的任何字符A-Za-z0-9_并将其删除。该[]字符集的边界。的+是一个字符集的边界上多余的,但通常是指1个或多个字符。该u标志扩展了表达式以包括unicode字符支持,这意味着它不会删除字符代码255之类的字符ª²³µ。具有unicode和ascii字符的各种用法示例3v4l.org/hSVV5
fyrye '19


0

我也在寻找答案,我的意图是清理每个非alpha区域,并且不应有多个空间。
所以,我修改亚历克斯的答案,这是为我工作 preg_replace('/[^a-z|\s+]+/i', ' ', $name)
的正则表达式以上转向sy8ed sirajul7_islamsy ed sirajul islam
说明:正则表达式将检查又没从A到Z的情况下,不区分大小写的方式或一个以上的空格,它会被转换为单一空间。


-2

您可以将字符串拆分为字符并进行过滤。

<?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

?>

投票失败的原因:3v4l.org/fqLVZ 此外,与单个简单preg_replace()调用相比,在未知长度的字符串上调用(3 + N)函数似乎没有吸引力。
mickmackusa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.