前面的话
正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配、查找、替换及分割等操作。前面介绍了正则表达式的基础语法,本文将详细介绍正则表达式函数
匹配与查找
【preg_match()】
preg_match()函数用来执行一个正则表达式匹配,搜索subject与pattern给定的正则表达式的一个匹配。返回pattern的匹配次数。它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后将会停止搜索。preg_match_all()不同于此,它会一直搜索subject直到到达结尾。如果发生错误preg_match()返回FALSE
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = [, int $offset = ]]] )
pattern表示要搜索的模式,字符串类型
subject表示输入字符串
如果提供了参数matches,它将被填充为搜索结果。$matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推
flags可以被设置为以下标记:1、PREG_OFFSET_CAPTURE。如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。注意:这会改变填充到matches参数的数组,使其每个元素成为一个由第0个元素是匹配到的字符串,第1个元素是该匹配字符串在目标字符串subject中的偏移量;2、offset。通常,搜索从目标字符串的开始位置开始。可选参数offset用于指定从目标字符串的某个未知开始搜索(单位是字节)
<?php
//从URL中获取主机名称
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $matches);
$host = $matches[]; //获取主机名称的后面两部分
preg_match('/[^.]+\.[^.]+$/', $host, $matches); //domain name is: php.net
echo "domain name is: {$matches[0]}\n";
?>
<?php
$pattern = '/www\.[^\.\/]+\.com/i';
$subject = 'www.baidu.com,www.qq.com,www.cnblogs.com';
preg_match($pattern,$subject,$matches);
/*
array (size=1)
0 => string 'www.baidu.com' (length=13)
*/
var_dump($matches);
?>
【preg_match_all()】
preg_match_all()与preg_match()类似,不同的是preg_match()在第一次匹配之后就会停止搜索,而函数preg_match_all()则会一直搜索到指定字符串的结尾,可以获取到所有匹配到的结果
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = ]]] )
<?php
$pattern = '/www\.[^\.\/]+\.com/i';
$subject = 'www.baidu.com,www.qq.com,www.cnblogs.com';
preg_match_all($pattern,$subject,$matches);
/*
array (size=1)
0 =>
array (size=3)
0 => string 'www.baidu.com' (length=13)
1 => string 'www.qq.com' (length=10)
2 => string 'www.cnblogs.com' (length=15)
*/
var_dump($matches);
?>
【preg_grep()】
preg_grep()返回给定数组input中与模式pattern 匹配的元素组成的数组
array preg_grep ( string $pattern , array $input [, int $flags = ] )
如果flags设置为PREG_GREP_INVERT,这个函数返回输入数组中与 给定模式pattern不匹配的元素组成的数组
<?php
$pattern = '/www\.[^\.\/]+\.com/i';
$subject = ['baidu.com','www.qq.com','www.cnblogs.com'];
var_dump (preg_grep($pattern,$subject));
/*
array (size=2)
1 => string 'www.qq.com' (length=10)
2 => string 'www.cnblogs.com' (length=15)
*/
?>
替换
【preg_replace()】
preg_replace()执行一个正则表达式的搜索替换,搜索subject匹配pattern的部分,以replacement进行替换
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = - [, int &$count ]] )
replacement表示用于替换的字符串或字符串数组。如果这个参数是一个字符串,并且pattern是一个数组,那么所有的模式都使用这个字符串进行替换。如果pattern和replacement都是数组,每个pattern使用replacement中对应的元素进行替换。如果replacement中的元素比pattern中的少,多出来的pattern使用空字符串进行替换
<?php
$string = 'April 15, 2016';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3'; //April1,2016
echo preg_replace($pattern, $replacement, $string);
?>
<?php
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[] = '/quick/';
$patterns[] = '/brown/';
$patterns[] = '/fox/';
$replacements = array();
$replacements[] = 'bear';
$replacements[] = 'black';
$replacements[] = 'slow'; //The bear black slow jumped over the lazy dog.
echo preg_replace($patterns, $replacements, $string);
?>
【preg_replace_callback()】
preg_replace_callback()执行一个正则表达式搜索并且使用一个回调进行替换
mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = - [, int &$count ]] )
<?php
// 将文本中的年份增加一年.
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// 回调函数
function next_year($matches)
{
// 通常: $matches[0]是完成的匹配
// $matches[1]是第一个捕获子组的匹配
// 以此类推
return $matches[].($matches[]+);
}
/*
April fools day is 04/01/2003
Last christmas was 12/24/2002
*/
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text); ?>
【preg_filter()】
preg_filter() 执行一个正则表达式搜索和替换,等价于preg_replace()除了它仅仅返回(可能经过转化)与目标匹配的结果
mixed preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = - [, int &$count ]] )
<?php
$subject = array('', 'a', '', 'b', '', 'A', 'B', '');
$pattern = array('/\d/', '/[a-z]/', '/[1a]/');
$replace = array('A:$0', 'B:$0', 'C:$0');
/*
Array
(
[0] => A:C:1
[1] => B:C:a
[2] => A:2
[3] => B:b
[4] => A:3
[7] => A:4
)
*/
print_r(preg_filter($pattern, $replace, $subject)); /*
Array
(
[0] => A:C:1
[1] => B:C:a
[2] => A:2
[3] => B:b
[4] => A:3
[5] => A
[6] => B
[7] => A:4
)
*/
print_r(preg_replace($pattern, $replace, $subject));
?>
分割
【preg_split()】
preg_split()通过一个正则表达式分隔字符串
array preg_split ( string $pattern , string $subject [, int $limit = - [, int $flags = ]] )
如果指定limit,将限制分隔得到的子串最多只有limit个,返回的最后一个子串将包含所有剩余部分。limit值为-1,0或null时都代表"不限制";可以使用null跳过对flags的设置
flags可以是任何下面标记的组合(以位或运算 | 组合):PREG_SPLIT_NO_EMPTY——如果这个标记被设置,preg_split()将进返回分隔后的非空部分;PREG_SPLIT_DELIM_CAPTURE——如果这个标记设置了,用于分隔的模式中的括号表达式将被捕获并返回;PREG_SPLIT_OFFSET_CAPTURE——如果这个标记被设置,对于每一个出现的匹配返回时将会附加字符串偏移量。注意:这将会改变返回数组中的每一个元素,使其每个元素成为一个由第0个元素为分隔后的子串,第1个元素为该子串在subject中的偏移量组成的数组
<?php
//使用逗号或空格(包含" ", \r, \t, \n, \f)分隔短语
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
/*
Array
(
[0] => hypertext
[1] => language
[2] => programming
)
*/
print_r($keywords);
?>
转义
【preg_quote()】
preg_quote()转义正则表达式字符
string preg_quote ( string $str [, string $delimiter = NULL ] )
正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
<?php
$keywords = '$40 for a g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords; // 返回 \$40 for a g3\/400
?>
前端学PHP之正则表达式函数的更多相关文章
-
前端学PHP之正则表达式基础语法
前面的话 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本 ...
-
前端学PHP之字符串函数
× 目录 [1]特点 [2]输出 [3]空格[4]大小写[5]HTML[6]格式化[7]比较 前面的话 字符串的处理和分析在任何编程语言中都是一个重要的基础,往往是简单而重要的.信息的分类.解析.存储 ...
-
前端学PHP之数组函数
× 目录 [1]键值操作 [2]记数[3]回调函数[4]组合[5]栈和队列[6]顺序 前面的话 PHP中的数组功能非常强大,数组处理函数有着强大.灵活.高效的特点.PHP5提供了近100个操作数组的系 ...
-
前端入门12-JavaScript语法之函数
声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...
-
JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
-
Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解
1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...
-
Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace --去掉所有特殊字符,只剩字母 SELECT REGEXP ...
-
PHP-PCRE正则表达式函数
PCRE正则表达式函数 PCRE字符类 \\b 词边界 \\d 匹配任意数字 \\s 匹配任意空白,如TAB制表符或空格 \\t 匹配一个TAB ...
-
Node.js之【正则表达式函数之match、test、exec、search、split、replace使用详解】
1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...
随机推荐
-
SVM松弛变量-记录毕业论文3
上一篇博客讨论了高维映射和核函数,也通过例子说明了将特征向量映射到高维空间中可以使其线性可分.然而,很多情况下的高维映射并不能保证线性可分,这时就可以通过加入松弛变量放松约束条件.同样这次的记录仍然通 ...
-
supervisor 安装 配置 及 使用
supervisor是微软官方推荐的一个工具,传送门, 所以我们也使用这个工具来管理我们的asp.net core应用进程 服务器环境:ubuntu14.04 x64 安装 apt-get ...
-
paxos 实现
原文地址:http://rdc.taobao.com/blog/cs/?p=162 本文主要介绍zookeeper中zookeeper Server leader的选举,zookeeper在选举lea ...
-
BZOJ 2173: 整数的lqp拆分( dp )
靠着暴力+直觉搞出递推式 f(n) = ∑F(i)f(n-i) (1≤i≤n) (直接想大概也不会很复杂吧...). f(0)=0 感受一下这个递推式...因为和斐波那契有关..我们算一下f(n)+f ...
-
Activiti的全局事件机制及其监听处理
概述 Activiti在5.15以后的版本后,增加了统一的事件入口,不需要再像以前那样,监听流程的事件时,在流程定义的BPMN文件中为每个节点及流程增加以下的配置,以实现监听事件的做法,这种做法导致我 ...
-
Deep Learning.ai学习笔记_第三门课_结构化机器学习项目
目录 第一周 机器学习策略(1) 第二周 机器学习策略(2) 目标:学习一些机器学习优化改进策略,使得搭建的学习模型能够朝着最有希望的方向前进. 第一周 机器学习策略(1) 搭建机器学习系统的挑战:尝 ...
-
Alpha冲刺5
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/9989898.html 作业博客:https://edu.cnblogs.com/campus/ ...
-
【PAT】B1063 计算谱半径(20 分)
水题,没有难点 #include<stdio.h> #include<algorithm> #include<math.h> using namespace std ...
-
对象反序列化出现类型不匹配的情况(spring-boot-devtools)
目前在做springboot项目的shiro session redis共享功能.但是有一个对象我把它放到redis中之后再取出来就会出现类型不匹配的异常 AuthorizationUser user ...
-
TypeError: &#39;range&#39; object doesn&#39;t support item deletion
python 是个逐步迭代开发的过程,他不是向下兼容的,更不是向上兼容,版本不一致,好端端的程序就是不能运行了. 下面是在python 2中能运行,在Python 3中不能运行的代码.其实也很简单.但 ...