【问题标题】:How can I check with a regex that a string contains only certain allowed characters?如何使用正则表达式检查字符串仅包含某些允许的字符?
【发布时间】:2011-02-16 20:08:36
【问题描述】:

我需要一个特殊的正则表达式,但对它们没有任何经验,所以我向你们求助。

我需要验证分类标题字段,使其中几乎没有任何特殊字符。

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

除了上述之外,还应该允许:

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

【问题讨论】:

  • 仅供参考,“重音符号”不是单独的字符。 å 和 a 是不同的字符,é 和 e(以及 ú 和 u 等)也是如此,至少就计算机而言。
  • 那只需要é,谢谢
  • 您希望字符串使用什么编码? (显然不是 ascii,utf-8?)你为什么要删除字符?看起来 html 转义字符串会比正则表达式匹配每个坏字符并删除它更好。
  • 如果这不是特定于语言的问题,请删除语言标签。

标签: php regex


【解决方案1】:

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

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

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

这是一个更安全的版本:

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

+ 对 1 次或多次出现响应 true。

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    细分:

    ^ = 匹配字符串的开头

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

    $ = 匹配字符串的结尾

    更新来自 cmets 的所有建议。谢谢大家!

    【讨论】:

    • åäöé 也是大写版本?
    • 大写 å,ä,ö,é 怎么样?也许是 /i 修饰符?
    • +1 回答了这个问题,但我认为他在使用正则表达式插入 html 之前对字符串进行消毒的设计是脆弱的,html 转义函数会更易于维护和健全。至于字母的大写版本,我认为 Chris 只是举例说明如何包含它们,Camran 可以添加他想要的所有字母。
    • 只需在其中添加ÅÄÖ 即可完成:) 哦,如果您想彻底一点,请稍微解释一下正则表达式,主要是 ^、$、* 和括号的含义。
    • 小心,- 是错误的。需要在字符类的末尾。而且大部分反斜杠都是不必要的。
    【解决方案3】:

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

    同样,如果您运行的是 >PHP5.2,则可以使用出色的 Filter 函数,这些函数专为您的情况而设计。

    【讨论】:

      【解决方案4】:

      嘿,伙计,它真的非常非常简单。只需对您不想要的任何内容进行正则表达式替换...

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

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

      PHP:

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

      如果您拥有a-zA-Z0-9£()+=%/*$ 的部分,只需添加您想要通过正则表达式并被允许在帖子中使用的字符。


      编辑:

      更广阔

      这个正则表达式的版本包含所有大写和小写重音字符。它们是 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);

      【讨论】:

        【解决方案5】:
        ^[\sa-zA-Z0-9åäö&()+%/*$€é,.'"-]*$
        

        将匹配所有必需的字符。

        在 PHP 中:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          相关资源
          最近更新 更多