为什么这个正则表达式取代破折号字符?

时间:2013-02-17 03:13:28

标签: php regex preg-replace preg-match

我正在努力更好地理解正则表达式,但似乎无法理解这一点。

preg_replace("/[^a-zA-Z0-9.?!\s]/", "", $mystring);

我认为这不会取代破折号,因为在上面的示例中它将被视为“通过”。但每次我运行它时,短划线都会被移除。

1 个答案:

答案 0 :(得分:5)

您没有提供示例$mystring值,这会有所帮助。

正如所写的那样,这个正则表达式将替换$mystring中的一个且只有一个字符。具体来说,您的角色类在一开始就包含一个克拉字符(^)。在任何与Perl兼容的正则表达式引擎(其中PHP是一个)中,这表示不是这些东西(有关更多信息,请参阅character classes)。因此,您的表达基本上剥离了

的任何内容
  • a和z之间的小写字母
  • A和Z之间的大写字母
  • 0到9之间的数字
  • 一段时间
  • 问号
  • 感叹号
  • 空白角色

短划线字符以上之一,因此匹配并替换。

然而,你所写的破折号的“通过”的假设是正确的。短划线字符是字符类中的4个特殊字符之一,它用于指示一系列字符。