正如我们前面所知,正则表达式有许多元字符表示匹配时间(量词),所有这些都可以重复,以匹配前面的单个字符。有时,我们可能需要匹配一组多个字符一起出现的次数。这时,我们需要分组。它是将这些字符括在括号中,并指定子表达式(也称为分组)。然后可以指定这个子表达式的重复次数,也可以对子表达式进行其他操作。此时,括号中的一组字符可以视为一个整体。
分组模式的例子。
例如,在搜索字符串中,多个win字符串的字符连续出现。可以这样完成。
?php $str='这是win winwindows!';preg_match_all('/(win) /',$str,$ marr);var _ dump($ marr);
没有分组模式可以同时匹配多个字符吗?我们发现前面的操作符号:【w,I,n】,虽然可以和winwin字符匹配,但因为是用w,I,n的组合来表示一个或多个字符,不会限制顺序。可以看到它匹配wwin、www、inw等图片。只要是这三个字组成的,很多字都匹配成功。
你如何匹配上面的?每一个都有2个结果?这是子模式(子匹配)。默认情况下,除了将多个字符组合成一个整体之外,括在括号中的表达式的这一部分将存储在临时缓冲区中,以便以后调用正则表达式。在上面的例子中,我们不需要延迟调用。那么,如何屏蔽这个子表情的抓取内容呢?就在“”前加“”吗?3360”就可以了。让我们看看下面的例子:正则表达式分组非捕获模式。
非捕捉模式有什么优势?从上面,我们可以减少捕获和匹配时间。因此,在不必要的分组表达式中添加非捕获前缀?3360”,可以节省内存开销,提高匹配速度!
只谈正则表达式分组,默认情况下,子表达式被捕获并存储在缓冲区中。以备后续调用。情况如何?实际上,这是对正则表达式的引用。根据正则表达式模式中从左到右遇到的内容,按顺序存储每个捕获的子匹配。用于存储子匹配的缓冲区编号从1开始,通常最多可以存储为9。所以下面的表达式引用的是值,也叫后向引用。
让我们看一下下面的例子,找到一个系统单词:add,它彼此不相邻,在一个字符串中出现几次。
?php $ str=' add123456addasdfpreg_match_all('/(add)d 1/',$str,$ marr);var _ dump($ marr);
反向引用常用于处理一些特殊的匹配情况。例如,在搜索字符串中,不相邻的重复字符串。在一对html标签中查找内容。尤其是分析html非常常见(注意,如果使用反向引用,匹配捕获不能在前面屏蔽,即不能添加)?3360 '前缀)。会经常使用:
?PHP $ str=file _ get _ contents(' http://blog . chacuo . net/');preg _ match _ all('/( s )[^]*[^]*/1/',$str,$marr);var _ dump($ marr);//(S)表示除非显示字符之外的所有字符,非显示字符通常用作html标记名。//标签格式一般是[] *在标签的其他属性后面。//后面的[] *表示标记.中间内容/标记表示中间内容,以“”结尾,因此匹配所有[] *字符//最后一个。
以上是使用正则表达式的重要描述和示例,例如分组、反向匹配和非捕获分组。希望对想要改变属性和功能的朋友有所帮助。同时,欢迎朋友们交流!