PHP中剔除除字母数字和欧洲字符以外的所有内容

4

我正在验证我的评论脚本,需要删除除西欧地区以外的非字母数字字符。

我的计划是使用正则表达式删除所有非字母数字字符:

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

但是当前的正则表达式去除了所有的欧洲字符和英镑符号,所以 "Café Rouge" 变成了 "Caf Rouge"。

我该如何将欧洲字符数组添加到上述正则表达式中。

数组如下:

£, €, 
á, à, â, ä, æ, ã, å,
è, é, ê, ë,
î, ï, í, ì,
ô, ö, ò, ó, ø, õ,
û, ü, ù, ú,
ÿ,
ñ,
ß

I use UTF-8 解决方案:
$comment = preg_replace('/[^\p{Latin}\d\s\p{P}]/u', '', $comment);

并且

$name = preg_replace('/[^\p{Latin}]/u', '', $name);

$name 还会删除标点符号和空格。

感谢快速回复。


你只是想防止 SQL 注入吗?这个问题已经得到解决了。没有必要为此限制输入。- 《伟大的逃避(或:你需要了解的关于文本处理的知识)》 - deceze
防止注入只是其中一个问题。我还希望有限制数量的非字母数字字符,因为我可能会在以后重用标题作为友好链接,并且通常,因为我不喜欢奇怪的东西进入我的数据库。 - Koffeehaus
作为一个使用非西方文字并且偶尔喜欢在文本中添加有用的装饰符号的人,我有点不满意我的打字被称为“奇怪的东西”,如果一个网站悄悄地删除了我写的一部分内容,我会非常非常生气。 - Eevee
2个回答

12
preg_replace('/[^\p{Latin}\d ]/u', '', $str);

在我看来,空格也必须保留 (/[^\p{Latin}\d\s]/u)。 - piouPiouM
@piouPiouM - 我不确定 OP 是否希望保留制表符和其他空格字符。一些欧洲人的名字也包含 '- 字符,因此最有可能允许的字符集将根据 OP 的测试进行调整... - Ωmega

0
echo preg_replace('/[^A-Z0-9 £€áàâä...]/ui', '', $string);

重要的部分是 /u 标志。请确保您的源代码和 $string 是 UTF-8 编码。

我仍然认为这是错误的方法,因为它严格限制了用户输入的内容,而且这肯定会让一些人感到烦恼,但无论如何,随你便吧... 顺便说一下,你的列表中不包含标点符号。


1
嗯,问题是,我想保持评论的专业性,因此“café”应该是“café”,而不是“cafe”;但我也宁愿去掉其他符号,如心形、钻石等。所以我认为一个独占数组比一个包容性数组更合适。 - Koffeehaus

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