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

时间:2010-05-07 13:07:39

标签: php regex

我需要一个特殊的正则表达式并且没有任何经验,所以我转向你们这个人。

我需要验证分类广告标题字段,因此它几乎没有任何特殊字符。

只允许使用字母和数字,以及三个瑞典字母å,ä,ö(大写或小写)。

除此之外,还应允许这些:

  • “&”符号
  • 括号“()”
  • 数学符号“ - ”,“+”,“%”,“/”,“*”
  • 美元和欧元符号
  • 一封口音签名:“é”。 //只需要这个
  • 双引号和单引号。
  • 逗号“,”和点“。”标志

5 个答案:

答案 0 :(得分:20)

试试这个:

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

故障:

^ =匹配字符串的开头

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

$ =匹配字符串的结尾

已更新,其中包含评论中的所有建议。谢谢你们!

答案 1 :(得分:1)

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

同样,如果您运行的是> PHP5.2,则可以使用专为您的情况设计的优秀Filter功能。

答案 2 :(得分:1)

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

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

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

这是一个更安全的版本:

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

+对1次或多次出现的响应为真。

更多信息,请访问https://regexr.com/

答案 3 :(得分:0)

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

将匹配所有必需的字符。

在PHP中:

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

答案 4 :(得分:-1)

嘿哥们,这真的很简单。只做正则表达式替换任何你不想要的东西......

在这个例子中 - 我简单地说“这个东西是不被允许的”

更具体地说,“如果它不在这个正则表达式匹配中,用空字符串替换该字符。

PHP:

$result = preg_replace('#([^a-zA-Z0-9£()+=%/*$,.])#imx', '', $subject);

如果您拥有a-zA-Z0-9£()+=%/*$的部分只是添加了您希望通过正则表达式的字符,则可以在帖子中使用。


编辑:

更广泛

正则表达式的这个vberion包含所有大写和小写重音字符。他们用ASCII格式,因为我不知道写它们的关键!

$result = preg_replace('#([^a-zA-Z0-9£()+=%/*$,.\x99\xBC\xBD\xBE\xC0\xC1\xC2\xC3\xC4\xC5\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD1\xD2\xD3\xD4\xD5\xD6\xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF9\xFA\xFB\xFC\xFD])#imx', '', $subject);