ChatGPT解决这个技术问题 Extra ChatGPT

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

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

有没有人有这样做的功能?


L
Louis

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

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

zuk1: regexbuddy 对此有很大帮助
这是一个示例,如果您想将连字符作为允许的字符包含在内。我需要这个,因为我需要根据电子邮件地址从 Moodle 用户名中删除不允许的字符: preg_replace("/[^a-z0-9_.@\-]/", '', $string);
这与正则表达式周围的撇号(单引号)而不是引号(双引号)完全相同吗?例如:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
我们想要对此进行解释:)。人们来这里看看为什么会这样。请也考虑正则表达式的解释!谢谢
如果我们想保留重音字符怎么办?
v
voondo

对于 unicode 字符,它是:

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

嗨,voondo,/ui 是怎么回事.. 你怎么称呼它?谁能给我一些启示。谢谢你。
为了清楚起见,它们被称为标志。它们被放在结束分隔符之后(在这种情况下是“/”,但它可以是“~”或“@”或任何您想使用的字符,只要开始和结束分隔符相同)并更改表达式的行为。
顺便说一句,\w 包括 \d,因此 \d 是不必要的。此外,这是错误的,因为它还会在结果字符串中留下下划线(也包含在 \w 中)。
这仍然有一个错误,字符类需要以 ':]' 终止,因此正确的行是: preg_replace("/[^[:alnum:][:space:]]/ui", '', $字符串);
由于 [:alnum:] 已经涵盖了这两种情况,这里真的需要 i 标志吗?
t
topher

Regular expression 是您的答案。

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

i 代表不区分大小写。

^ 表示,不以开头。

\d 匹配任何数字。

az 匹配 a 和 z 之间的所有字符。由于 i 参数,您不必指定 az 和 AZ。

\d 之后有一个空格,因此此正则表达式中允许有空格。


我们想要对此进行解释:)。人们来这里看看为什么会这样。请也考虑正则表达式的解释!不是每个人都足够先进,可以不加解释地知道你在那里写了什么。谢谢
@PratikCJoshi i 代表不区分大小写。 ^ 表示,不以开头。 \d 匹配任何数字。 az 匹配 a 和 z 之间的所有字符。由于 i 参数,您不必指定 az 和 AZ。在 \d 之后有一个空格,所以这个正则表达式中允许有空格。
人们不会将评论视为答案。请更新答案!
J
Jonathon

如果您需要支持其他语言,而不是典型的 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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

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


如果我在正则表达式末尾添加 unicode u 标志,对我有用 - /[^\p{L}\p{N} ]+/u
s
scrollup

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

\W|_

并根据需要使用(使用正向 / 斜杠分隔符)。

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

使用这个解释正则表达式在做什么的好工具在这里测试它:

http://www.regexr.com/


您仍然需要 /u 标志,否则非 ascii 字母也会被删除。
整洁的 but would also match spaces,如果需要,可能可以通过使用 character class 和额外的 quantifier for one or more 将性能提高一倍{ 2}
I
Intacto
[\W_]+

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

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

请参阅此处的示例:https://regexr.com/3h1rj


这个正则表达式 /[\W_]+/u 是什么意思?
\W 是字符 A-Za-z0-9_\w 的倒数。所以 \W 将匹配任何不是 A-Za-z0-9_ 的字符并将它们删除。 []character set boundary+ 在字符集边界上是多余的,但通常表示 1 个或多个字符。 u 标志将表达式扩展为包括 unicode 字符支持,这意味着它不会删除字符代码 255 以外的字符,例如 ª²³µ 。使用 unicode 和 ascii 字符的各种用法示例 3v4l.org/hSVV5
P
PASTAGA
preg_replace("/\W+/", '', $string)

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


根据@Alex Stevens 的回答,这不会抓住下划线“_”。