如何使用正则表达式在PHP中“清理”字符串?

5
例如,假设我有:
$blah = "C$#@#.a534&";

我希望过滤字符串,只保留字母、数字和 ".",得到 "C.a534"。

我该如何做?

5个回答

13

如果你知道应该允许哪些字符,你可以使用否定字符组(在正则表达式中)来删除其他所有内容:

$blah = preg_replace('/[^a-z0-9\.]/i', '', $blah);

注意我在正则表达式中使用了i修饰符。它匹配不区分大小写,因此我们无需指定a-z A-Z


4

这个问题已经被许多人回答过,但是:

function cleanit($input){
    return preg_replace('/[^a-zA-Z0-9.]/s', '', $input);
}


$blah = cleanit("C$#@#.a534&");

你需要转义 . - Nick
@Nick,字符类中的点确实需要转义。 - Tatu Ulmanen
1
我认为在类内部不需要转义 .,但是我不是100%确定。 - smottt
是的。像 ( ) \ [ ] ? 这样的字符确实如此。 - Lawrence Cherone

2
你可以使用preg_replace
$text = preg_replace('/[' . preg_quote('CHARSYOUDONTWANT','/') .  ']/','',$text);

在另一种情况下,如果你只想要特定的字符,请尝试这个。
$text = preg_replace('/[^' . preg_quote('CHARSONLYYOUWANT','/') .  ']/','',$text);

例如
$blah = "C$#@#.a534&";
$blah = preg_replace('/[' . preg_quote('$#@&','/') . ']/','',$blah);
echo $blah;

在使用 preg_quote() 函数时,应该指定分隔符,以便它也可以被转义。 - jwueller
谢谢提醒,分隔符是可选的,所以我没有写它的工作原理。 - Tufan Barış Yıldırım
这是可选的,但如果我尝试在第一个参数中使用 /,它将不会被转义,因为在正则表达式中它没有特殊含义。可以通过显式指定分隔符来防止这种情况发生。 - jwueller

1

或者反过来做:

$text = preg_replace('/[^a-zA-Z0-9.]/','',$text);

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接