/* 测试环境: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()