/* 测试环境: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. docker初安装的血泪史

    最近docker很火,不管是朋友圈内还是公司内聊天都离不开docker,于是对docker产生了极大的好奇心,凭着一颗程序猿的好奇心开始了docker的安装血泪史. 首先我有一台从公司退役的本本x22 ...

  2. 用VS2015创建ASP.NET Web Forms 应用程序

    在 Visual Studio 2015 中,按着以下步骤创建一个 Web Forms 应用程序项目: 1.起始页/文件--->新建项目--->已安装--->模板--->Vis ...

  3. SQL学习——基础语句(1)

    简序 1.SQL,指结构化查询语言,全称是 Structured Query Language. 2.SQL 让您可以访问和处理数据库. 3.SQL 是一种 ANSI(American Nationa ...

  4. Paper阅读总结Day1

    Paper阅读总结Day1 1.Convolutional Neural Networks For Facial Expression Recognition 文章思想 简单的一篇关于表情识别的文章, ...

  5. DataTables入门

    转载 https://blog.csdn.net/gfd54gd5f46/article/details/65938189

  6. css pointer-event

    详见:张鑫旭 CSS3 pointer-events:none应用举例及扩展 pointer-events:none ,可以使事件穿透, 如: 2 覆盖在 1 上面. 给 2 设置 pointer-e ...

  7. 第十一章 Python之异常处理

    异常 异常时程序运行时发生错误的信号(在程序错误时,则会产生一个异常,若程序没有处理,则会抛出该异常,程序的运行也随之终止) 常见的异常类型AttributeError 试图访问一个对象没有的树形,比 ...

  8. Long型转换成IP段String、StringIP段转换成Long型

    /** 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx * * @param ip * @return */ public static String getIpFromLong(Lon ...

  9. 伍、ajax

    一.ajax的概念 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新 ...

  10. C# 基础复习 二 面向对象

    继承:子承父业  子:子类    父:父类    业:所有非私有成员 好处:代码的复用   继承后,实例化子类时,不止子类的构造,父类的构造也会执行,而且父类的构造先于子类的构造执行 即使在子类可以看 ...