php 正则表达式的子模式详解

首先,我们先看一段PHP代码:

代码如下:

<?php
$time = date ("Y-m-d H:i:s");
$pattern = "/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/i";
if(preg_match($pattern,$time,$arr)){
echo "<pre>";
print_r($arr);
echo "</pre>";
}
?>

显示结果:


代码如下:

Array
(
[0] => 2012-06-23 03:08:45
)

有没有注意到,显示的结果只有一条数据,即符合匹配模式的时间格式,那如果只有一条记录的话,为什么还要用数组保存呢?直接使用字符串保存不是更好?

带着这个问题,我们来看下正则表达式中的子模式。

在正则表达式中,可以使用“(”和“)”将模式中的子字符串括起来,以形成一个子模式。将子模式视为一个整体时,那么它就相当于一个单个字符。

比如,我们将以上的代码稍微修改下,改成如下:


代码如下:

<?php
$time = date ("Y-m-d H:i:s");
$pattern = "/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/i";
if(preg_match($pattern,$time,$arr)){
echo "<pre>";
print_r($arr);
echo "</pre>";
}
?>

注意:我只修改了$pattern,在匹配模式中,使用了括号()

执行结果:

代码如下:

Array
(
[0] => 2012-06-23 03:19:23
[1] => 2012
[2] => 06
[3] => 23
[4] => 03
[5] => 19
[6] => 23
)

总结:我们可以使用小括号给整个匹配模式进行分组,默认情况下,每个分组会自动拥有一个组号,规则是,从左到右,以分组的左括号为标志,第一个出现的分组为组号1,第二个为组号2,以此类推。其中,分组0对应整个正则表达式。对整个正则匹配模式进行了分组以后,就可以进一步使用“向后引用”来重复搜索前面的某个分组匹配的文本。例如:\1代表分组1匹配的文本,\2代表分组2匹配的文本等等我们可以进一步修改下代码,如下所示:


代码如下:

<?php
$time = date ("Y-m-d H:i:s");
$pattern = "/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/i";
$replacement = "\$time格式为:$0<BR>替换后的格式为:\\1年\\2月\\3日 \\4时\\5分\\6秒";
print preg_replace($pattern, $replacement, $time);
if(preg_match($pattern,$time,$arr)){
echo "<pre>";
print_r($arr);
echo "</pre>";
}
?>

注意:

因为是在双引号中,所以使用分组的时候应该使用两个反斜杠,如:\\1,而如果在单引号中,则使用一个反斜杠就可以了,如:\1
\\1用于捕获分组一种的内容:2012,\\6用于捕获分组6中的内容          
执行结果:

$time格式为:2012-06-23 03:30:31
替换后的格式为:2012年06月23日 03时30分31秒


代码如下:

Array
(
[0] => 2012-06-23 03:30:31
[1] => 2012
[2] => 06
[3] => 23
[4] => 03
[5] => 30
[6] => 31
)

(0)

相关推荐

  • 正则表达式教程之位置匹配详解

    本文实例讲述了正则表达式教程之位置匹配.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.问题引入 如果想匹配一段文本中的某个单词(暂不考虑多行模式,将在后面介绍),我们可能会像下面这样: 文本:Yesterday is history, tomorrow is a mystery, but today i

  • 正则表达式教程之重复匹配详解

    本文实例讲述了正则表达式教程之重复匹配.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.有多少个匹配 前面几篇讲的都是匹配一个字符,但是一个字符或字符集合要匹配多次,应该怎么做呢?比如要匹配一个电子邮件地址,用之前说到的方法,可能有人会写出像\w@\w\.\w这样的正则表达式,但这个只能匹配到像a@b.c

  • 正则表达式教程之子表达式用法分析

    本文实例讲述了正则表达式教程之子表达式用法.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.问题引入 首先来看一个例子,有的短语如Windows 2000虽然是多个单词组成,但其实是一个整体,HTML页面中可以使用非换行空格( 即non-breaking space)让它在浏览器中显示在一行上,现在来匹配

  • PHP正则表达式的逆向引用与子模式分析

    正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力. 对一个正则表达式模式或部分模式两边添加圆括号()可以把这部分表达式存储到一个临时缓冲区中. 所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容按顺序存储. 存储子匹配的缓冲区编号从1开始,连续编号至最大99个子表达式. 每个缓冲区都可以使用'\n'(或用'$n')访问,其中n为1至99的阿拉伯数字,用来按顺序标识特定缓冲区(子表达式). 例1:最简单最有用的例子是确定文字中连续出现两个相同单词的位置

  • 正则表达式教程之操作符及说明详解

    本文实例讲述了正则表达式中的操作符及说明.分享给大家供大家参考,具体如下: 一.普通字符 包括所有未显式指定为元字符的打印和非打印字符组成,如大小写字母.数字.标点符号等. 二.元字符 元字符是一些在正则表达式里有着特殊含义的字符.因为元字符在正则表达式里有着特殊的含义,所以这些字符不能用来代表它们本身,必须通过给它加个反斜杠前缀来转义,如此得到的转义序列将匹配那个字符本身而不是它特殊的元字符含义.如[表示一个字符集合的开始,如果在正则表达式中要匹配[,那么需要这样引用:\[,才能表示[本身.

  • 正则表达式教程之匹配单个字符详解

    本文实例讲述了正则表达式教程之匹配单个字符.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. java测试代码: /** * 根据正则表达式和要匹配的源文本,输出匹配结果 * @param regex 正则表达式 * @param sourceText 要匹配的源文本 */ public static void

  • 正则表达式、分组、子匹配(子模式)、非捕获子匹配(子模式)

    前面我们知道正则表达式有很多元字符表示匹配次数(量词),都是可以重复匹配前面出现的单个字符次数.有时候,我们可能需要匹配一组多个字符一起出现的次数.这个时候,我们需要分组了.就是用小括号来括起这些字符,指定子表达式(也叫做分组).然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作.这个时候,可以把括号中一组字符,看作一个整体了. 分组模式举例说明 如:查找字符串中,连续出现多个win字符串的字符.可以这样完 <?php $str = "this is win wi

  • 正则表达式教程之匹配一组字符详解

    本文实例讲述了正则表达式教程之匹配一组字符的方法.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.匹配多个字符中的某一个 在上一篇<正则表达式教程之匹配单个字符详解>中的一个匹配以na或sa开头的文本文件例子中,使用的正则表达式是.a.\.txt.如果还有一个文件是cal.txt,那么也将会被匹配到.如

  • js使用正则子表达式匹配首字母与尾字母相同单词的方法

    本文实例讲述了js使用正则子表达式匹配首字母与尾字母相同单词的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <html> <head> <script type="text/javascript"> //子表达式实例:找到首字母与尾字母相同的单词 function t1(){  var con = document.getElementsByName('content')[0].value;  var reg = /\b(\w

  • 仅1个例子轻松学习正则表达式

    正则表达式的语法就不多说了,大家可以自己搜索查阅相关资料学习.本文所举例子是在<JavaScript语言精粹>上看到的,看完之后对正则表达式有了进一步的理解,故分享之. 例子 //这是一个用来匹配URL的正则表达式,分组获取不同部分的信息 var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; var url = &quo

  • 深入分析正则表达式的子模式

    首先,我们先看一段PHP代码: <?php $time = date ("Y-m-d H:i:s"); $pattern = "/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/i"; if(preg_match($pattern,$time,$arr)){ echo "<pre>"; print_r($arr); echo "</pre>"; } ?> 显示结果:

  • 正则表达式教程之元字符的使用详解

    本文实例讲述了正则表达式教程之元字符的使用.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.对特殊字符进行转义 元字符是一些在正则表达式里有着特殊含义的字符.因为元字符在正则表达式里有着特殊的含义,所以这些字符就无法用来代表它们本身.在元字符前面加上一个反斜杠就可以对它进行转义,这样得到的转义序列将匹配那

随机推荐