在PHP中从字符串中剥离除字母数字以外的所有字符

44

我需要一个正则表达式或者其他字符串来替换一个字符串中除字母数字(a-z0-9)以外的所有字符。例如,,@#$(@*810 这类字符都应该去掉。有什么好的想法吗?

更新:现在我需要保留句点,即除了a-z, 1-9, .之外的所有字符都应该去掉。有什么好的想法吗?


当你说“去掉一切”时,你不想将Unicode映射到最接近的ASCII(“ASCII锤子”)吗?所以你认为Münchener Straße -> Mnchener Strae是可以接受的,而不是Muenchener Strasse - smci
5个回答

76
$string = preg_replace("/[^a-z0-9.]+/i", "", $string);

匹配一个或多个不是a-z 0-9 [大小写不敏感] 或者 "."的字符,并用""替换它们


我该如何更改代码以仅允许点(即 .)? - Ali
1
在字符集内部,您无需转义句点。 - Gumbo
你真的需要加号吗?有人在下面发布了没有加号的代码。 - kuchi
3
@kuchi:虽然这是一个很老的问题,但我刚刚遇到它:如果你用一个空字符串来替换,那么它不会有任何影响。但是如果你用其他东西来替换,比如短横线("-"),它就会有所不同。使用加号+时,它会将"test$!§test"更改为"test-test"。如果没有"+",它会变成"test---test" - Jörn Berkefeld

21

对于这个问题,我喜欢使用 [^[:alnum:]],因为它可以减少错误的可能性。

preg_replace('/[^[:alnum:]]/', '', "(ABC)-[123]"); // returns 'ABC123'

2
/[^a-z0-9.]/

应该能解决问题。

我该如何更改以仅允许点(即.)? - Ali
完整的正则表达式是什么?我不知道语法。 - Ali

2

尝试:

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

/i代表大小写不敏感(如果你需要的话)。


1
这也适用于将非数字、单词字符或句点替换为下划线。对于文件名很有用。
$clean = preg_replace('/[^\d\w.]+/', '_', $string);

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