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

)

时间: 2024-11-08 19:04:25

php 正则表达式的子模式详解的相关文章

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

函数 mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) 功能 在 subject 中搜索 pattern 模式的匹配项并替换为 replacement.如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换. replacement可以包含\n形式或$n形式的逆向引用,n可以为0到99,\n表示匹配pattern第n

关于日期正则表达式的思路详解

1        概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好. 前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正. 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用.因应用场景的不同,写出的正则也不同,复杂程度也自然不同.正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂

java-JAVA正则表达式疑问求详解

问题描述 JAVA正则表达式疑问求详解 正则表达式<[^>]什么意思.. [^>]我知道 左边加个<不太理解为什么匹配了>左边的<和一个字符 解决方案 先找到<符号,然后要求紧跟后面的字符不是>符号这样找到的就是结果. 解决方案二: Java正则表达式详解Java 正则表达式详解Java正则表达式详解 解决方案三: 我一直以为^只能做开始的意思. 解决方案四: 先找到<符号,然后要求紧跟后面的字符不是>符号 这样找到的就是结果.

javascript类型系统_正则表达式RegExp类型详解_javascript技巧

前面的话 前面已经介绍过javascript中正则表达式的基础语法.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,使用正则表达式可以进行强大的模式匹配和文本检索与替换.本文将介绍正则表达式的RegExp对象,以及正则表达式涉及 到的属性和方法 对象 javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法:另一种是构造函数写法 Perl写法 正则表达式字面量写法,又叫Perl写法,因为javascript的正则表达式特性

表单验证正则表达式实例代码详解_javascript技巧

表单验证正则表达式具体内容如下所示: 首先给大家解释一些符号相关的意义      1.  /^$/ 这个是个通用的格式.          ^ 匹配输入字符串的开始位置:$匹配输入字符串的结束位置      2. 里面输入需要实现的功能.         * 匹配前面的子表达式零次或多次:        + 匹配前面的子表达式一次或多次:        ?匹配前面的子表达式零次或一次:        \d  匹配一个数字字符,等价于[0-9] 下面通过一段代码给大家分析表单验证正则表达式,具体代

js正则表达式常用函数详解(续)_正则表达式

正则表达式对象的方法 1.test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式.如果存在则返回 true,否则就返回 false. 2.exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组. 3.compile,把正则表达式编译为内部格式,从而执行得更快.正则表达式对象的属性 1.source,返回正则表达式模式的文本的复本.只读. 2.lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置. 3.input ($_),返回执

js正则表达式常用函数详解(续)

正则表达式对象的方法 1.test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式.如果存在则返回 true,否则就返回 false. 2.exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组. 3.compile,把正则表达式编译为内部格式,从而执行得更快. 正则表达式对象的属性 1.source,返回正则表达式模式的文本的复本.只读. 2.lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置. 3.input ($_),返回

shell正则表达式及grepfindawksed详解

shell 正则表达式和grep awk find sed sort uniq cut 一,grep 1,基础参数 grep-[acinv]'搜索内容串'filename -a以文本文件方式搜索 -c计算找到的符合行的次数 -i忽略大小写 -n顺便输出行号 -v反向选择,即找没有搜索字符串的行 [root@test3 ~]# cat Travel.doc Travel is a good way to refresh and broaden our horizon. During your tr

oracle 10g正则表达式REGEXP_LIKE用法详解

ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,REGEXP_REPLACE :与REPLACE的功能相似 它们在用法上与Oracle SQL 函数LIKE.INSTR.SUBSTR 和REPLACE 用法相同, 但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符. POSIX 正则表达式由标准的