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

zuk*_*uk1 331 php regex string

我需要删除字符串中没有a-z A-Z 0-9设置或不是空格的所有字符.

有人有这个功能吗?

Cha*_*rch 668

听起来你几乎已经知道你想做什么,你基本上把它定义为正则表达式.

preg_replace("/[^A-Za-z0-9 ]/", '', $string);
Run Code Online (Sandbox Code Playgroud)

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

voo*_*ndo 166

对于unicode字符,它是:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清,它们被称为标志.它们被放在结束分隔符之后(在这种情况下它是"/",但它可以是"〜"或"@"或任何你想要使用的字符,只要开始和结束分隔符是相同的)并更改表达的行为. (4认同)
  • 这里的`i`标志真的有必要,因为`[:alnum:]`已经涵盖了两种情况? (4认同)
  • 这里仍然有一个错误,字符类需要用':]'终止,所以正确的行是:preg_replace("/ [^ [:alnum:] [:space:]]/ui",'', $字符串); (2认同)

ras*_*spi 49

正则表达是你的答案.

$str = preg_replace('/[^a-z\d ]/i', '', $str);
Run Code Online (Sandbox Code Playgroud)
  • i代表不区分大小写.
  • ^ 意思是,不是从一开始.
  • \d 匹配任何数字.
  • a-z匹配a和之间的所有字符z.由于i参数,您不必指定a-zA-Z.
  • 之后\d有一个空格,这样的空间才能在此正则表达式.

  • 想要关于这个的说明:).人们来这里看看为什么会这样.请考虑正则表达式的解释!不是每个人都足够先进,无需解释就知道你在那里写了什么.谢谢 (3认同)

Ale*_*ens 17

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

\W|_
Run Code Online (Sandbox Code Playgroud)

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

preg_replace("/\W|_/", '', $string);
Run Code Online (Sandbox Code Playgroud)

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

http://www.regexr.com/


Jon*_*hon 9

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

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
Run Code Online (Sandbox Code Playgroud)
  • [^\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} ]+/', '', '????!@£$%^&*()'); // ????
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我在正则表达式末尾添加 unicode `u` 标志,则对我有用 - `/[^\p{L}\p{N} ]+/u` (4认同)

Int*_*cto 7

[\W_]+
Run Code Online (Sandbox Code Playgroud)

 

$string = preg_replace("/[\W_]+/u", '', $string);
Run Code Online (Sandbox Code Playgroud)

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

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

  • `\W` 是 `\w` 的反义词,即字符 `A-Za-z0-9_`。因此“\W”将匹配任何不是“A-Za-z0-9_”的字符并将其删除。`[]` 是一个[字符集边界](https://www.regular-expressions.info/charclass.html)。`+` 在字符集边界上是多余的,但通常表示 1 个或多个字符。`u` 标志扩展了表达式以包含 unicode 字符支持,这意味着它不会删除字符代码 255 之外的字符,例如 `ª²³µ` 。使用 unicode 和 ascii 字符的各种用法示例 https://3v4l.org/hSVV5。 (2认同)