/* 测试环境:PHP5.3.29(PCRE8.32) */

常用函数:(正则表达式规则基本同JS_RE_Read.txt)

PS:
1.PHP中的PCRE一般仅使用这三个修饰符:"i" "m" "s"。
2.PHP的正则表达式中反向引用使用注意点:
"/(abc)\\1/"和'/(abc)\1/'等价,前者之所以\\1是因为包含在双引号里(因为PHP的双引号和单引号不同)。

1:int preg_match(string $pattern, string $subject [,array &$matches [,int $flags = 0 [,int $offset = 0]]])
参数说明:
$pattern:要搜索的模式,字符串形式。
$subject:被搜索字符串。
$matches:如果提供了参数matches,它将被填充为搜索结果。$matches[0]为完整模式匹配到的文本,$matches[1] 为第一个捕获组匹配到的文本,以此类推。
$flags:备选值为PREG_OFFSET_CAPTURE,这时$matches将变成二维数组,见下面。
offset:通常,搜索从目标字符串的开始位置开始,参数offset用于指定从目标字符串的某个未知开始搜索。(单位:字节)

返回匹配的次数,0表示匹配失败,1表示匹配一处,发生未知错误返回FALSE,这个函数会在匹配一次之后停止搜索,所以匹配成功总是返回1,如果想要执行全局模式请使用preg_match_all()函数。

变量$matched详解:
$pattern="/(\d{2})(?'w'we)\\1(\w)/";
$subject="dfg12we12f";
$out=preg_match($pattern, $subject, $arr);
print_r($arr);
>>>Array(
[0] => 12we12
[1] => 12
[w] => we
[2] => we
[3] => f
)

当$flag = PREG_OFFSET_CAPTURE时的$matches变量:
$pattern="/(\d{2})(we)/";
$subject="dfg12we12f55we";
$out=preg_match($pattern, $subject, $arr, PREG_OFFSET_CAPTURE);
>>>Array(
[0] => Array(
[0] => 12we
[1] => 3
)
[1] => Array(
[0] => 12
[1] => 3
)
[2] => Array(
[0] => we
[1] => 5
)
)

2:int preg_match_all(string $pattern ,string $subject[, array &$matches[, int $flags = PREG_PATTERN_ORDER[, int $offset = 0]]] )
参数说明:
$matches:一个二维数组。
$flags:(其中第一或第二个可以和第三个可以相加使用。)
PREG_PATTERN_ORDER:结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推;
PREG_SET_ORDER:结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组),$matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推;
PREG_OFFSET_CAPTURE:每个发现的匹配返回时会增加它相对目标字符串的偏移量。

返回完整匹配的次数,如果没有匹配返回0,发生未知错误返回FALSE。

变量$matched详解:
$pattern="/(\d{2})we/";
$subject="dfg12we12f55we";
$out=preg_match_all($pattern, $subject, $arr, PREG_PATTERN_ORDER);
print_r($arr);
>>>Array(
[0] => Array(
[0] => 12we
[1] => 55we
)
[1] => Array(
[0] => 12
[1] => 55
)
)

如果$flag = PREG_SET_ORDER:
>>>Array(
[0] => Array(
[0] => 12we
[1] => 12
)
[1] => Array(
[0] => 55we
[1] => 55
)
)

如果$flag = PREG_OFFSET_CAPTURE:($flag也等价于PREG_PATTERN_ORDER + PREG_OFFSET_CAPTURE)
$pattern="/(\d{2})(we)/";
$subject="dfg12we12f55we";
$out=preg_match_all($pattern, $subject, $arr, PREG_OFFSET_CAPTURE);
>>>Array(
[0] => Array(
[0] => Array(
[0] => 12we
[1] => 3
)
[1] => Array(
[0] => 55we
[1] => 10
)
)
[1] => Array(
[0] => Array(
[0] => 12
[1] => 3
)
[1] => Array(
[0] => 55
[1] => 10
)
)
[2] => Array(
[0] => Array(
[0] => we
[1] => 5
)
[1] => Array(
[0] => we
[1] => 12
)
)
)

3:string preg_replace(string $pattern, string $replacement, string $subject[, int $limit = -1[, int &$count]])
参数说明:
$limit:最大替换次数。 默认是-1(无限制)。
$count:返回替换执行的次数。

返回一个已被替换的字符串。

$replacement中可以使用$i(推荐)或\\i来引用一个分组(i的范围为0~99,并且不能引用显式命名分组)。

上述的\\i存在于双引号下,单引号使用\i。(理由上文提及过)

如果替换文本需要使用$和\:
"\\\\"
"\\$"
'\\'
'\$'

4:string preg_replace_callback(string $pattern, string $callback, string $subject[, int $limit = -1[, int &$count]])
参数说明:

返回一个已被替换的字符串。

例如:
$pattern="/(w)\w/";
$subject="welikeappleweyes";
$out=preg_replace_callback($pattern, "fun1", $subject);
function fun1($m){
return "$1";
}
echo $out;
//并且使用函数返回replacement时$和\\均失效,回调函数只有一个参数$m,为本次匹配时这个模式的捕获组。
//看下面例子:(只把上述的fun1修改)
function fun1($m){
print_r($m);
}
>>>
Array(
[0] => we
[1] => w
)
Array(
[0] => we
[1] => w
)

建议直接使用匿名函数:
$out=preg_replace_callback($pattern, function($m){
return "$1";
}, $subject);

5:array preg_split(string $pattern, string $subject[, int $limit = -1[, int $flags = 0]])
参数说明:
$limit:可选,如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个子串将包含所有剩余部分。(limit值为-1代表全部分隔)
$flag:备选,PREG_SPLIT_NO_EMPTY:返回分隔后的非空部分。

返回一个使用pattern作为边界分隔subject后的数组。

6:preg_last_error()
该函数无参数。
返回:(最后一次PCRE正则执行匹配时产生的错误代码)
PREG_NO_ERROR -未发生错误
PREG_INTERNAL_ERROR -PCRE引擎内部错误
PREG_BACKTRACK_LIMIT_ERROR -回溯超限
PREG_RECURSION_LIMIT_ERROR -递归超限
PREG_BAD_UTF8_ERROR -异常的UTF-8数据(仅在UTF-8模式的正则匹配时发生)
PREG_BAD_UTF8_OFFSET_ERROR -偏移量与合法的UTF-8字符不匹配(仅在UTF-8模式的正则匹配时发生)

例如:
preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');
if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR){
print '回溯超限!';
}

其他:
其他常量:
PCRE_VERSION返回PHP中内置的PCRE版本信息。

其他函数:
preg_filter()
preg_grep()
preg_quote()
preg_replace_callback_array()

PHP正则表达式函数总结的更多相关文章

  1. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  2. Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解

    1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...

  3. Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace

    Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace   --去掉所有特殊字符,只剩字母  SELECT REGEXP ...

  4. PHP-PCRE正则表达式函数

    PCRE正则表达式函数 PCRE字符类 \\b        词边界 \\d        匹配任意数字 \\s        匹配任意空白,如TAB制表符或空格 \\t        匹配一个TAB ...

  5. Node.js之【正则表达式函数之match、test、exec、search、split、replace使用详解】

    1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...

  6. Oracle 正则表达式函数-REGEXP_REPLACE

    背景 当初写oracle的一个存储过程,以前不知道sql里也有正则表达式,关于正则表达式教程很多了,这里只是记录下Oracle也有这个功能,下次再有类似需求用这个处理的确方便很多. 想起存储过程,就想 ...

  7. php中常用的正则表达式函数

    php中常用的正则表达式函数 * preg_match() * preg_match_all() * preg_replace() * preg_filter() * preg_grep() * pr ...

  8. <转>PHP中正则表达式函数

    PHP中的正则表达式函数 在PHP中有两套正则表达式函数库.一套是由PCRE(Perl Compatible Regular Expression)库提供的,基于传统型NFA.PCRE库使用和Perl ...

  9. 前端学PHP之正则表达式函数

    前面的话 正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配.查找.替换及分割等操作.前面介绍了正则表达式的基础语法,本文将详细介绍正 ...

  10. PHP正则表达式函数学习

    正则表达式是在日常开发中经常用到的,通常一些使用频率过高的正则表达式都是直接粘贴复制,对于基础正则的使用还是要铭记于心的,今天抽时间整理一些php正则表达式的用法. 一.php中常用的正则表达式函数 ...

随机推荐

  1. Ubuntu下推荐安装软件

    前言:都是全平台软件,通用性好. 1.搜狗输入法 官网下载: 不能双击.deb安装成功,需要安装依赖,可参考:https://www.cnblogs.com/chendeqiang/p/1017741 ...

  2. hive2.0函数大全

    Hive2.0函数大全(中文版)   摘要 Hive内部提供了很多函数给开发者使用,包括数学函数,类型转换函数,条件函数,字符函数,聚合函数,表生成函数等等,这些函数都统称为内置函数. 目录 数学函数 ...

  3. HD-ACM算法专攻系列(22)——Max Sum

    问题描述: AC源码: 此题考察动态规划,解题思路:遍历(但有技巧),在于当前i各之和为负数时,直接选择以第i+1个为开头,在于当前i各之和为正数时,第i个可以不用作为开头(因为前i+1个之和一定大于 ...

  4. 在.NetCore2.0中使用Swagger

    一.新建.netCore webapi项目 二.安装swagger ,通过 Package Manager 控制台:Install-Package SwashBuckle.AspNetCore -Pr ...

  5. 洛谷P3358 最长k可重区间集问题(费用流)

    题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重 ...

  6. P3376 【模板】网络最大流(70)

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  7. DOM基础知识(概念、节点树、事件、Document)

    1.   DOM概念 全称为 Document Object Model,译为文档对象模型 D:文档 - DOM将HTML页面解析为一个文档 —> document对象 O:对象 - DOM将H ...

  8. Java标识符规范

    1.标识符用来定义包名,类名,方法名,变量名,常量名. 2.标识符必须由字母.下划线.$符号组成,不能以数字开头.不能是Java中的保留关键字.

  9. day19-1 迭代器,三元表达式,列表推导式,字典生成式,

    目录 迭代器 可迭代对象 迭代器对象 总结 三元表达式(三目表达式) 列表推导式 字典生成式 迭代器 可迭代对象 拥有iter方法的对象就是可迭代对象 # 以下都是可迭代的对象 st = '123'. ...

  10. spring使用注解开发

    1.准备工作(1)导入common-annotations.jar(2)导入schema文件 文件名为spring-context-2.5.xsd(3)在xml的beans节点中配置 service层 ...