您现在的位置是:首页 > 学无止境
PHP正则之递归匹配
本文地址: http://www.laruence.com/2011/09/30/2179.html
作者: Laruence
正则是否能处理括号配对的正则匹配.
比如, 对于如下的待匹配的字符串:
((()))就是一个括号配对的字符串. 而对于如下的待匹配字
作者: Laruence
正则是否能处理括号配对的正则匹配.
比如, 对于如下的待匹配的字符串:
((()))就是一个括号配对的字符串. 而对于如下的待匹配字
本文地址: http://www.laruence.com/2011/09/30/2179.html
作者: Laruence
正则是否能处理括号配对的正则匹配.
比如, 对于如下的待匹配的字符串:
((()))就是一个括号配对的字符串. 而对于如下的待匹配字符串:
((()则不是一个括号配对的字符串.
在以前, 这种情况, 正则无法处理, 最多只能处理固定层数的递归, 而无法处理无线递归的情况… 而在perl 5.6以后, 引入了一个新的特性:
Recursive patterns, 使得这种需求可以被正确的处理.
Recursive pattern引入了一个新的符号(?R), 这个符号可以表示: 正则模式本身, 比如:
#1(?R)*#这个正则, 首先它匹配数字”1″, 然后(?R)*表示, 正则式本身, 也就是说, 可以认为是:
#1(正则本身(正则本身).....)*#于是, 对于文章开头说到的情况:”括号配对”, 可以写下如下的正则式:
#\((?R)*\)#就可以正确处理.
这里提醒一下, 用的时候, 要注意一定要给递归一个截至条件, 比如如果上面的例子写成:
#1(?R)#那么, 就不会正常工作, 因为这个展开以后表示要匹配无限多个”1″, 所以在上面的例子中, 写作了(?R)*, 让它可以有一个截止的条件(可以为0个).
另外, 这个新特性也支持序号引用(?index), 比如:
#(1)(2)(3)(?3)(?2)(?1)#表示匹配, 123321.
如果想更多的了解这个新特性, 可以参看:
http://www.php.net/manual/en/regexp.reference.recursive.php
文章评论
- 登录后评论
点击排行
-
php-fpm安装、配置与优化
转载自:https://www.zybuluo.com/phper/note/89081 1、php中...
-
centos下postgresql的安装与配置
一、安装(以root身份进行)1、检出最新的postgresql的yum配置从ht...
-
Mysql的大小写敏感性
MYSQL在默认的情况下查询是不区分大小写的,例如:CREATE TABLE...
-
关于URL编码
转载自:http://www.ruanyifeng.com/blog/2010/02/url_encoding....
-
header中的Cache-control
网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的...