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

时间:2009-03-18 16:29:19

标签: php regex string

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

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

10 个答案:

答案 0 :(得分:638)

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

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

答案 1 :(得分:156)

对于unicode字符,它是:

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

答案 2 :(得分:48)

Regular expression是你的答案。

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

答案 3 :(得分:16)

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

\W|_

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

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

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

http://www.regexr.com/

答案 4 :(得分:4)

[\W_]+

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

选择所有不是A-Z,a-z,0-9并删除它。

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

答案 5 :(得分:4)

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

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]定义了一个取反的(它将匹配定义的字符)字符类别:
    • \p{L}:来自任何语言的一封信。
    • \p{N} any 脚本中的数字字符。
    • :空格字符。
  • + 贪婪地匹配1次和无限次之间的字符类。

这将保留其他语言和脚本以及A-Z的字母和数字:

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

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

答案 6 :(得分:2)

preg_replace("/\W+/", '', $string)

您可以在此处进行测试:http://regexr.com/

答案 7 :(得分:0)

我也在寻找答案,我的意图是清理每一个非阿尔法,并且不应该有多个空格。
所以,我修改了Alex对此的回答,这对我有用 preg_replace('/[^a-z|\s+]+/i', ' ', $name)
上面的正则表达式将sy8ed sirajul7_islam变为sy ed sirajul islam
说明:如果不敏感方式或多个空格,正则表达式将从a到z检查 NOT ANY ,并且它将被转换为单个空格。

答案 8 :(得分:-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

?>

答案 9 :(得分:-8)

我用这个:

//to remove non english character
$str = preg_replace('/[^\00-\255]+/u', '', $str);