【问题标题】:preg_match and regex - allow or exclude characterspreg_match 和 regex - 允许或排除字符
【发布时间】:2015-09-26 16:33:53
【问题描述】:

我在 preg_match 中允许指定字符时遇到问题。我试过制作以下模式:/^[A-Za-z0-9 !@#$%&()-_\[\]:;\"'|,.\?\/]/ 现在它允许一切,即使 * 不存在。

我知道有一条规则,在正则表达式指定字符之前,我必须在字符之前放置"\"。如果我错了,请纠正我。

谁能解释一下这是如何工作的?

我想允许这个字符: A-Z a-z 0-9 !@#$%&()-_[]:;"'|,.?/ (当然还有空格)

并排除这个: ~`^*+={}\

【问题讨论】:

标签: php regex preg-match


【解决方案1】:

未转义的连字符需要位于字符类中的第一个或最后一个位置,或者需要转义。否则,它被认为是一个范围。所以使用:

/^[A-Za-z0-9 !@#$%&()_\[\]:;\"'|,.\?\/-]/

在您的正则表达式 /^[A-Za-z0-9 !@#$%&()-_\[\]:;\"'|,.\?\/]/ 中,- 位于 )(ASCII:41)和 _(ASCII:95)的中间,因此匹配此范围内的所有字符。

您还需要使用锚点来匹配整个输入:

/^[A-Za-z0-9 !@#$%&()_\[\]:;\"'|,.\?\/-]+$/

【讨论】:

  • 不幸的是它不起作用。这仍然允许使用 {} 等字符。
  • 检查更新的答案,使用锚点:/^[A-Za-z0-9 !@#$%&()_\[\]:;\"'|,.\?\/-]+$/
  • 现在可以完美运行了!非常感谢@anubhava!
  • 嗯...我已经检查了所有内容并忘记了变音字符。我发现 \p{L} 而不是 A-Za-z 应该可以工作,但又不行。任何想法:(?
  • 试试:/^[\p{L}0-9 !@#$%&()_\[\]:;\"'|,.\?\/-]+$/u
【解决方案2】:

字符类中的这部分)-_是一个字符范围。
)_

您可能应该转义破折号 ..)\-_ 然后它只是一个字符。

  41    29  )       73  49  I      
  42    2A  *       74  4A  J      
  43    2B  +       75  4B  K      
  44    2C  ,       76  4C  L      
  45    2D  -       77  4D  M      
  46    2E  .       78  4E  N      
  47    2F  /       79  4F  O      
  48    30  0       80  50  P      
  49    31  1       81  51  Q      
  50    32  2       82  52  R      
  51    33  3       83  53  S      
  52    34  4       84  54  T      
  53    35  5       85  55  U      
  54    36  6       86  56  V      
  55    37  7       87  57  W      
  56    38  8       88  58  X      
  57    39  9       89  59  Y      
  58    3A  :       90  5A  Z      
  59    3B  ;       91  5B  [      
  60    3C  <       92  5C  \      
  61    3D  =       93  5D  ]      
  62    3E  >       94  5E  ^      
  63    3F  ?       95  5F  _    

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2013-08-09
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多