$regex = <<<__REGEX__
/^(?P<user>
"[\w!#$%&'*+\/=?^`{|}~.@()[\]\\;:,<>-]+" (?# quoted username)
| (?!\.)[\w!#$%&'*+\/=?^`{|}~.-]+(?<!\.) (?# non-quoted username)
) @ (?P<host>
(?:(?!-)[\w-]+(?<!-)\.)+[\w-]+(?<!-) (?# host)
| \[(\d{1,3}\.){3}\d{1,3}\] (?# host ip address)
)$/x
/^(?P<user>
"[\w!#$%&'*+\/=?^`{|}~.@()[\]\\;:,<>-]+" (?# quoted username)
| (?!\.)[\w!#$%&'*+\/=?^`{|}~.-]+(?<!\.) (?# non-quoted username)
) @ (?P<host>
(?:(?!-)[\w-]+(?<!-)\.)+[\w-]+(?<!-) (?# host)
| \[(\d{1,3}\.){3}\d{1,3}\] (?# host ip address)
)$/x
__REGEX__;
如例解释:
1.分组和反向引用
(?P<user>)表示括号内正则表达式命名为user,在反向引用时可以使用(?P=user)
在反向引用时可以使用(?:)来避免捕获数据,但是数据反向索引位置不变
2.正向预查和反向预查
(?=),(?<=),(?!),(?<!)分别表示元素前必须紧接,元素后必须紧接,元素前不能紧接,元素后不能紧接的内容
3.注释(?# 注释内容)
该标记表示括号内的内容为注释
4.惰性匹配
可使用?修饰+,*,?等限定符,将限定符变成惰性类型(尽早结束匹配)