【问题标题】:regular expression which should allow limited special characters应该允许有限的特殊字符的正则表达式
【发布时间】:2013-08-26 14:21:13
【问题描述】:

谁能告诉我文本字段的正则表达式不允许跟随字符,并且可以接受其他特殊字符、字母、数字等:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ @ &

【问题讨论】:

  • 您的意思是在文本框中吗?你能扩展更多吗?
  • @491243 你改昵称了吗? :)
  • 提供一些样本输入、预期输出和正则表达式风格。

标签: regex


【解决方案1】:

这将不允许字符串包含上述字符串的任何部分中的任何字符。

^(?!.*[+\-&|!(){}[\]^"~*?:@&]+).*$

简要说明

  • 在行首(字符串开头或换行符后)断言位置^
  • 断言不可能从这个位置开始匹配下面的正则表达式(负前瞻(?!.*[+\-&|!(){}[\]^"~*?:@&]+)
    • 匹配任何不是换行符的单个字符.*
      • 在零次和无限次之间,尽可能多次,按需回馈(贪婪)*
    • 匹配下面列表中的单个字符[+\-&|!(){}[\]^"~*?:@&]+
      • 一次和无限次之间,尽可能多次,按需回馈(贪婪)+
      • 字符“+”+
      • 一个“-”字符\-
      • 字符之一&|!(){}[” «&|!(){}[
      • 一个“]”字符\]
      • 字符之一^"~*?:@&” «^"~*?:@&
  • 匹配任何不是换行符的单个字符.*
    • 在零次和无限次之间,尽可能多次,按需回馈(贪婪)*
  • 在行尾断言位置(在字符串末尾或换行符之前)$

【讨论】:

    【解决方案2】:

    通常最好将您允许的字符列入白名单,而不是将您不允许的字符列入黑名单。无论是从安全角度还是从易于实施的角度来看。

    如果你真的走黑名单路线,这里有一个例子,但要注意,语法并不简单。

    http://groups.google.com/group/regex/browse_thread/thread/0795c1b958561a07

    如果您想将所有重音字符列入白名单,也许使用 unicode 范围会有所帮助?看看这个链接。

    http://www.regular-expressions.info/unicode.html

    【讨论】:

      【解决方案3】:

      我认为这些是 Solr 需要转义的字符。如果是这种情况,并且如果您使用 PHP 进行编码,那么您应该使用我来自 Github 的PHP utility functions。这是其中的一个 Solr 函数:

      /**
      * Escape values destined for Solr
      *
      * @author Dotan Cohen
      * @version 2013-05-30
      *
      * @param value to be escaped. Valid data types: string, array, int, float, bool
      * @return Escaped string, NULL on invalid input
      */
      
      function solr_escape($str)
      {
          if ( is_array($str) ) {
              foreach ( $str as &$s ) {
                  $s = solr_escape($s);
              }
      
              return $str;
          }
      
          if ( is_int($str) || is_float($str) || is_bool($str) ) {
              return $str;
          }
      
          if ( !is_string($str) ) {
              return NULL;
          }
      
          $str = addcslashes($str, "+-!(){}[]^\"~*?:\\");
          $str = str_replace("&&", "\\&&", $str);
          $str = str_replace("||", "\\||", $str);
      
          return $str;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        相关资源
        最近更新 更多