为什么我们需要逃避!<>:= - 在php正则表达式中?

Pac*_*ier 10 php regex web

http://php.net/manual/en/function.preg-quote.php:

特殊的正​​则表达式字符是:.\ +*?[^] $(){} =!<> | : -

但是这个页面说的是特殊字符[ \ ^ $ . | ? * + ( )

好的,我知道第一页是专门针对php正则表达式的.但是为什么我们需要逃避!,<,>,:,=,-

我试图做一个preg_match不逃避<,>,-并且!和一切工作的完美.

Tim*_*ker 5

这些字符是元字符,但它们不需要转义.他们的共同点是它们出现在特殊的分组结构中:

(?:...)      # non-capturing group
(?=...)      # positive lookahead
(?!...)      # negative lookahead
(?<name>...) # named capturing groups
(?<=...)     # positive lookbehind
(?<!...)     # negative lookbehind
(?>...)      # atomic group
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,它们只具有特殊含义.因此,如果您获取任何字符串并转义所有这些字符:[\^$.|?*+(){,那么您将获得一个正确匹配字符串字符的正则表达式,因为其他元字符永远不会位于元上下文中.

例如,]如果有一个先前未转义的人[打开了一个角色类,那么它只是一个元字符.

类似地,-它只是一个字符类中的元字符,意思是"范围",如[a-z] (在文字-中)[abc-].

所以要逃避字符串,[tag-soup]你只需要逃避[.在字符类之外的,]-只是当作文字.

总之,如果你取一个字符串并转义所有"无条件"元字符([\^$.|?*+(){),那么你得到一个正则字符串字符串完全匹配的正则表达式.