如何使用正则表达式检查字符串是否只包含特定的允许字符?

21

我需要一个特殊的正则表达式,但我对它们毫无经验,所以在这方面我求助于你们。

我需要验证分类广告标题字段,以确保它不包含任何特殊字符,几乎没有。

只允许字母和数字,还有三个瑞典字母 å、ä、ö(大写或小写)。

除了上述内容之外,还应允许以下内容:

  • "&" 符号。
  • 括号 "()"
  • 数学符号 "-", "+", "%", "/", "*"
  • 美元和欧元符号
  • 一个带重音符号的字母:"é"。 // 仅此一个是必需的
  • 双引号和单引号符号。
  • 逗号“,”和点号“.”符号

3
FYI,“重音符号”不是一个独立的字符。就电脑而言,å和a、é和e(以及ú和u等)就像不同的字符一样。 - David Gelhar
那么只需要é,谢谢。 - user188962
1
你期望这个字符串使用什么编码?(显然不是ASCII,UTF-8?)为什么要删除这些字符?似乎将字符串进行HTML转义比使用正则表达式匹配每个坏字符并将其删除更好。 - marr75
如果这不是一个特定于语言的问题,请删除语言标签。 - Gumbo
4个回答

37

试试这个:

^[\s\da-zA-ZåäöÅÄÖ&()+%/*$€é,.'"-]*$

解析:

^ = 匹配字符串的开头

[...]* = 匹配方括号中的任何字符(或范围)一次或多次

$ = 匹配字符串的结尾

已更新,采纳了评论中的所有建议。感谢大家!


åäöé 的大写版本也包括在内吗? - David Gelhar
大写字母å,ä,ö,é怎么办?也许使用/i修饰符? - Dal Hundal
1
回答了这个问题,但我认为他在使用正则表达式对字符串进行HTML插入之前的净化设计是脆弱的,一个HTML转义函数会更易于维护和理智。至于大写字母版本,我认为Chris只是举例说明如何包含它们,Camran可以添加他想要的所有字母。 - marr75
1
只需添加 ÅÄÖ 到其中,你就完成了 :) 如果你想要更加详细,解释一下正则表达式,主要是 ^、$、* 和括号的含义。 - Esko
2
小心,- 是错误的。需要放在字符类的末尾。而且大多数反斜杠是不必要的。 - Tim Pietzcker
显示剩余3条评论

7

接受的答案存在安全漏洞:

^[\s\da-zA-ZåäöÅÄÖ&()+%/*$€é,.'"-]*$

这将为空字符串生成真实的响应,因为*代表0次或多次出现。

下面是更安全的版本:

^[\s\da-zA-ZåäöÅÄÖ&()+%/*$€é,.'"-]+$
+表示至少出现1次,当匹配到1次或多次时返回true。
详细信息请访问:https://regexr.com/

1

PHP有各种函数可以帮助进行文本验证。您可能会发现它们比直接使用正则表达式更合适。考虑使用strip_tags(), htmlspecialchars(), htmlentities()

此外,如果您正在运行>PHP5.2,您可以使用出色的Filter函数,这些函数专为您的情况而设计。


0
^[\sa-zA-Z0-9åäö&()+%/*$€é,.'"-]*$

将匹配所有必需的字符。

在PHP中:

if (preg_match('#^[\sa-zA-Z0-9åäö&()+%/*$€é,.\'"-]*$#i', $subject)) {
 # Successful match
} else {
 # Match attempt failed
}

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