/* 测试环境: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. SQL*PLUS命令的使用大全

    Oracle的sql*plus是与oracle进行交互的客户端工具.在sql*plus中,可以运行sql*plus命令与sql*plus语句. 我们通常所说的DML.DDL.DCL语句都是sql*pl ...

  2. Js radio

    <input type="radio" name="sex" value="1" />男 <input type=&quo ...

  3. iOS 内网内测应用发布

    之前测试时,iOS 开发会把测试版本上传到蒲公英上,可以很方便的获取.后来认为不安全,万一测试版泄露了会有风险,就又回到了解放前,测试跑到开发那里编包.想过把手机越狱安装开发的编的 ipa 包,这样测 ...

  4. mvel2.0语法指南

    虽然mvel吸收了大量的java语法,但作为一个表达式语言,还是有着很多重要的不同之处,以达到更高的效率,比如:mvel像正则表达式一样,有直接支持集合.数组和字符串匹配的操作符. 除了表达式语言外, ...

  5. bzoj 3028: 食物 生成函数_麦克劳林展开

    不管怎么求似乎都不太好求,我们试试生成函数.这个东西好神奇.生成函数的精华是两个生成函数相乘,对应 $x^{i}$ 前的系数表示取 $i$ 个时的方案数. 有时候,我们会将函数按等比数列求和公式进行压 ...

  6. webpack——打包JS

    1.在文件中打开命令行,输入code ./    (我的编译器是vs code) 2.然后会弹出编译器,在编译器内新建js文件app,sum app.js import sum from './sum ...

  7. sklearn学习3----模型选择和评估(1)训练集和测试集的切分

    来自链接:https://blog.csdn.net/zahuopuboss/article/details/54948181 1.sklearn.model_selection.train_test ...

  8. [置顶] 智能家居开源项目 The open Home Automation Bus (openHAB)

    ================================================================================ 2014-05-19 论文的事情太多, ...

  9. LAMP 环境搭建备忘 -- Linux的安装(一)

    LAMP指的是 Linux + Apatch + MySQL / MariaDB + PHP/Perl/Python 一套搭建网站服务器的开源软件组合.工作原理图如下: 下面开始环境搭建 1 Linu ...

  10. 原生JS封装ajax以及request

    一.封装原生的xhr为ajax类 xhr以及用法见之前的文章 1.根据url确定请求的头部以及别的信息. var _headerConfig = {}; if(url.indexOf('getcapt ...