Php preg_匹配-无效范围-非常奇怪的错误

Php preg_匹配-无效范围-非常奇怪的错误,php,regex,Php,Regex,代码如下: $k = preg_replace('/[^a-zA-Z 0-9ßöäüÖÄÜ\"\._-\p{L}]/u', '', $k); (是的,我知道这是多余的) 错误消息: Warning: preg_replace(): Compilation failed: invalid range in character class at offset 33 现在看这条线,它工作得很好: $k= preg_replace('/[^a-zA-Z 0-9ßöäüÖÄÜ\"\.-_-\p{L

代码如下:

$k = preg_replace('/[^a-zA-Z 0-9ßöäüÖÄÜ\"\._-\p{L}]/u', '', $k);  
(是的,我知道这是多余的)
错误消息:

Warning: preg_replace(): Compilation failed: invalid range in character class at offset 33
现在看这条线,它工作得很好:

$k= preg_replace('/[^a-zA-Z 0-9ßöäüÖÄÜ\"\.-_-\p{L}]/u', '', $k);
因此,在正则表达式中添加或删除一个“-”将带来巨大的变化。
删除\p{L}时,两个正则表达式行都起作用


这是PHP(5.6.30)中的一个bug还是我遗漏了一些重要的东西?(现在是早上7点,我需要睡觉:)

在字符类中,字符范围是用字符
-
(连字符)定义的,但是
-\p{L}
没有定义范围

要在字符类中显示文字连字符,在PHP中有几种可能性:

  • 用反斜杠逃避它
  • 将其放在类的开头或否定字符
    ^
  • 把它放在课后
  • 将其置于范围或速记字符类之后
最后一个不太为人所知,这是你奇怪结果的原因。在第二种模式中,您处于这种情况:

   .-_    -     \p{L}
#  ^^^    ^---- the hyphen is after
#  '''--------- a range
# and in this case it is seen as a literal character

因此,为了回答您的问题,它不是一个bug。

在字符类中,字符范围是用字符
-
(连字符)定义的,但是
-\p{L}
没有定义范围

要在字符类中显示文字连字符,在PHP中有几种可能性:

  • 用反斜杠逃避它
  • 将其放在类的开头或否定字符
    ^
  • 把它放在课后
  • 将其置于范围或速记字符类之后
最后一个不太为人所知,这是你奇怪结果的原因。在第二种模式中,您处于这种情况:

   .-_    -     \p{L}
#  ^^^    ^---- the hyphen is after
#  '''--------- a range
# and in this case it is seen as a literal character

所以,为了回答您的问题,这不是一个bug。

谢谢,确实太晚了。它不应该是一个范围;)@约翰:是的,但是请注意,
\p{L}-a
是允许的,因为解析器从左到右读取并推断连字符是文字连字符。谢谢,时间确实晚了。它不应该是一个范围;)@约翰:是的,但是请注意,
\p{L}-a
是允许的,因为解析器从左到右读取并推断连字符是文字连字符。
A-Z-A的idem