preg_match - 无效范围 - 非常奇怪的bug

时间:2017-09-19 05:10:57

标签: 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}]/u', '', $k);

所以添加或删除一个" - "在正则表达式中发生了巨大的变化 删除\ p {L}

时,两个正则表达式行都有效

这是PHP(5.6.30)中的错误还是我错过了必要的东西? (现在是早上7点,我需要睡觉:)。

1 个答案:

答案 0 :(得分:2)

在字符类中,字符范围定义为字符-(连字符),但_-\p{L}未定义范围。

要在字符类中计算字面连字符,您在PHP中有几种可能性:

  • 用反斜杠
  • 来逃避它
  • 把它放在课程的开头或否定字符^
  • 之后
  • 把它放在课程的最后
  • 将它放在范围或速记字符类之后。

这最后一个并不为人所知,是造成奇怪结果的原因。在第二种模式中,您处于这种情况:

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

所以,回答你的问题,这不是一个错误。

相关问题