php正则 非捕获元 "?:" "
2018-11-30 本文已影响15人
爱折腾的傻小子
- 其中?:是非捕获元之一,还有两个非捕获元是?=和?!
- 这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串
- 后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
?: 使用方法
$rule1 = "/(?:\w+)/"; // 匹配,则捕获整体,不会捕获子组
$rule2 = "/(\w+)/"; // 匹配,则捕获整体,并捕获子组
preg_match($rule1, "Hi", $matches);
preg_match($rule2, "Hi", $matches2);
/**
* array:1 [
* 0 => "Hi"
* ]
*/
dump($matches);
/**
* array:2 [
* 0 => "Hi"
* 1 => "Hi"
* ]
*/
dump($matches2);
字符 | 描述 |
---|---|
(?:pattern) | 匹 配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。 |
(?=pattern) | 正 向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,’Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000″ 中的 “Windows” ,但不能匹配 “Windows 3.1″ 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 负 向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如’Windows (?!95|98|NT|2000)’ 能匹配 “Windows 3.1″ 中的 “Windows”,但不能匹配 “Windows 2000″ 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
$str = "Windows 95 Windows 3.2 Windows NT";
$rule1 = "/Windows (?=95|98|NT|2000)/"; // (?=) 匹配
preg_match($rule1, $str, $matches);
/**
* array:1 [
* 0 => "Windows"
* ]
*/
dump($matches);
$str = "Windows 95 Windows NT";
$rule1 = "/Windows (?!95|98|NT|2000)/"; // (?!)匹配
preg_match($rule1, $str, $matches);
/**
* array:1 []
*/
dump($matches);
参考文档:
那瞬间Run2future | 链接:https://www.cnblogs.com/-run/articles/2371078.html