PHP 正则表达式的几则使用技巧

我的PHP正则入门,是起源于网上的一篇文章,这篇文章由浅入深的阐述了PHP正则表达式使用的方法,我觉得是一个很好的入门材料,不过学成还是要 靠个人,在使用的过程中,还是会不断地忘记,因此反反复复的阅读了这篇文章有四五遍,对于其中一些比较困难的知识点,甚至要用很久才能消化,但是只要能见 坚持着看完,你会发现自己对于正则的运用能力就会显著提高。

PHP正则表达式的定义:

用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。

PHP中的正则函数:

PHP中有两套正则函数,两者功能差不多,分别为:

一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用“preg_”为前缀命名的函数;

一套由POSIX(Portable Operating System Interface of Unix )扩展提供的。使用以“ereg_”为前缀命名的函数;(POSIX的正则函数库,自PHP 5.3以后,就不在推荐使用,从PHP6以后,就将被移除)

由于POSIX正则即将推出历史舞台,并且PCRE和perl的形式差不多,更利于我们在perl和php之间切换,所以这里重点介绍PCRE正则的使用。

PCRE正则表达式

PCRE全称为Perl Compatible Regular Expression,意思是Perl兼容正则表达式。

在PCRE中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple/”。

正则中重要的几个概念有:元字符、转义、模式单元(重复)、反义、引用和断言,这些概念都可以在文章[1]中轻松的理解和掌握。

常用的元字符(Meta-character):

元字符     说明

\A       匹配字符串串首的原子

\Z       匹配字符串串尾的原子

\b       匹配单词的边界     /\bis/   匹配头为is的字符串   /is\b/   匹配尾为is的字符串   /\bis\b/ 定界

\B       匹配除单词边界之外的任意字符   /\Bis/   匹配单词“This”中的“is”

\d     匹配一个数字;等价于[0-9]

\D     匹配除数字以外任何一个字符;等价于[^0-9]

\w     匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z_]

\W     匹配除英文字母、数字和下划线以外任何一个字符;等价于[^0-9a-zA-Z_]

\s     匹配一个空白字符;等价于[\f\t\v]

\S     匹配除空白字符以外任何一个字符;等价于[^\f\t\v]

\f     匹配一个换页符等价于 \x0c 或 \cL

匹配一个换行符;等价于 \x0a 或 \cJ

匹配一个回车符等价于\x0d 或 \cM

\t     匹配一个制表符;等价于 \x09\或\cl

\v     匹配一个垂直制表符;等价于\x0b或\ck

\oNN   匹配一个八进制数字

\xNN   匹配一个十六进制数字

\cC    匹配一个控制字符

模式修正符(Pattern Modifiers):

模式修正符在忽略大小写、匹配多行中使用特别多,掌握了这一个修正符,往往能解决我们遇到的很多问题。

i     -可同时匹配大小写字母

M     -将字符串视为多行

S     -将字符串视为单行,换行符做普通字符看待,使“.”匹配任何字符

X     -模式中的空白忽略不计

U     -匹配到最近的字符串

e     -将替换的字符串作为表达使用

格式:/apple/i匹配“apple”或“Apple”等,忽略大小写。     /i

PCRE的模式单元:

//1 提取第一位的属性

/^\d{2} ([\W])\d{2}\\1\d{4}$匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式。这是因为模式“[\W]”的结果“/”已经被存储。下个位置“\1”引用 时,其匹配模式也是字符“/”。

当不需要存储匹配结果时使用非存储模式单元“(?:)”

例如/(?:a|b|c)(D|E|F)\\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)\2g/。

PCRE正则表达式函数:


代码如下:

preg_match()和preg_match_all()
preg_quote()
preg_split()
preg_grep()
preg_replace()

函数的具体使用,我们可以通过PHP手册来找到,下面分享一些平时积累的正则表达式:

匹配action属性


代码如下:

$str = '';
$match = '';
preg_match_all('/\s+action=\"(?!http:)(.*?)\"\s/', $str, $match);
print_r($match);

在正则中使用回调函数


代码如下:

/**
* replace some string by callback function
*
*/
function callback_replace() {
$url = 'http://esfang.house.sina.com.cn';
$str = '';
$str = preg_replace ( '/(?<=\saction=\")(?!http:)(.*?)(?=\"\s)/e', 'search(\$url, \\1)', $str );
echo $str;
}
function search($url, $match){
return $url . '/' . $match;
}

带断言的正则匹配


代码如下:

$match = '';
$str = 'xxxxxx.com.cn bold font
paragraph text
';
preg_match_all ( '/(?<=<(\w{1})>).*(?=<\/\1>)/', $str, $match );
echo "匹配没有属性的HTML标签中的内容:";
print_r ( $match );

替换HTML源码中的地址


代码如下:

$form_html = preg_replace ( '/(?<=\saction=\"|\ssrc=\"|\shref=\")(?!http:|javascript)(.*?)(?=\"\s)/e', 'add_url(\$url, \'\\1\')', $form_html );

最后,正则工具虽然强大,但是从效率和编写时间上来讲,有的时候可能没有explode来的更直接,对于一些紧急或者要求不高的任务,简单、粗暴的方法也许更好。

而对于preg和ereg两个系列之间的执行效率,曾看到文章说preg要更快一点,具体由于使用ereg的时候并不多,而且也要推出历史舞台了,再加个个人更偏好于PCRE的方式,所以笔者就不做比较了,熟悉的朋友可以发表下意见,谢谢。

(0)

相关推荐

  • 正则表达式匹配不包含某些字符串的技巧

    经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤"hede"字串,但这种写法是错误的.我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含'h','e','d'三个但字符.那什么样的正则表达式能过滤出不包含完整"hello"字串的信息呢? 事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确.就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问

  • 正则表达式高级技巧及实例详解 笨活儿

    英文原文来自Smashing Magazine.由笨活儿翻译.转载请注明出处. 正则表达式(Regular Expression, abbr. regex) 功能强大,能够用于在一大串字符里找到所需信息.它利用约定俗成的字符结构表达式来发生作用.不幸的是,简单的正则表达式对于一些高级运用,功能远远不够.若要进行筛选的结构比较复杂,你可能就需要用到高级正则表达式. 本文为您介绍正则表达式的高级技巧.我们筛选出了八个常用的概念,并配上实例解析,每个例子都是满足某种复杂要求的简单写法.如果你对正则的基

  • javascript 正则表达式(二) 使用技巧说明

    一.字符类       概念: 将单独的直接量字符放进方括号内就可以组合成字符类(character class). 注:红色表示不是特别清楚的 [...]  --表示字符类中任意一个字符都满足 [^...]--除字符类中的任意一个字符都满足 .--除换行符(\n)和Unicode终止符之外的任意字符(不知道有什么用?) \w--(word)任何ASCII单字字符,==[a-zA-Z0-9] \W--任何非ASCII单字字符,==[^a-zA-Z0-9] \s --(space)任何Unicod

  • ASP正则表达式技巧

    复制代码 代码如下: <% str = request("str") reg = request("reg") set regex = new RegExp With regex .Pattern = reg .IgnoreCase = False .Global = True End With Set match = regex.Execute(str) If match.Count > 0 Then For Each matched in match

  • 写出高效率的正则表达式技巧总结

    如果纯粹是为了挑战自己的正则水平,用来实现一些特效(例如使用正则表达式计算质数.解线性方程),效率不是问题:如果所写的正则表达式只是为了满足一两次.几十次的运行,优化与否区别也不太大.但是,如果所写的正则表达式会百万次.千万次地运行,效率就是很大的问题了. 为行文方便,先定义两个概念. 误匹配:指正则表达式所匹配的内容范围超出了所需要范围,有些文本明明不符合要求,但是被所写的正则式"击中了".例如,如果使用\d{11}来匹配11位的手机号,\d{11}不单能匹配正确的手机号,它还会匹配

  • 正则表达式的高级技巧分享

    正则表达式(regular expression abbr. regex) 功能强大,能够用于在一大串字符里找到所需信息.它利用约定俗成的字符结构表达式来发生作用.不幸的是,简单的正则表达式对于一些高级运用,功能远远不够.若要进行筛选的结构比较复杂,你可能就需要用到高级正则表达式. 本文介绍正则表达式的高级技巧.筛选出了八个常用的概念,并配上实例解析,每个例子都是满足某种复杂要求的简单写法.如果你对正则的基本概念尚缺乏了解,请先阅读这篇文章,或者这个教程,或者维基条目. 这里的正则语法适用于ph

  • 正则表达式高级学习技巧

    什么是RE? 想必各位大大在做文件查找的时侯都有使用过万用字符"*",比如说想查找在Windows目录下所有的Word文件时,你可能就会用"*.doc"这样的方式来做查找,因为"*"所代表的是任意的字符.RE所做的就是类似这样的功能,但其功能更为强大. 写程序时,常需要比对字符串是否符合特定样式,RE最主要的功能就是来描述这特定的样式,因此可以将RE视为特定样式的描述式,举个例子来说,"\w+"所代表的就是任何字母与数字所组成

  • .NET 正则表达式使用高级技巧之替换类介绍

    \d表示什么,{,5}表示什么,\[表示什么--,这里我只想提醒大家一点,为了避免和反向引用相冲突,在你用\nn表示八进制的ASCII码时,请在\后加0,就是说,\40在表示ASCII码时,请这样写\040. 替换 Regex类有一个静态的Replace方法,其实例也有一个Replace方法,这个方法很强大,因为它可以传入一个delegate,这样,你可以自定义每次捕获匹配时,如何处理捕获的内容. 以上这段代码说明了如果使用delegate MatchEvaluator 来处理正则的Match结

  • 模板引擎正则表达式调试小技巧

    基于正则表达式替换的模板引擎很容易遇上正则表达式最大回溯/递归的限制. 惰性匹配并不可怕,正常情况下模板并不会不够用,往往不会超出限制,discuz的模板引擎就大量使用了.但是因此而不去注意.不去学习,则容易书写错误并遇上问题. 当preg_*返回的是null的时候则要注意了,判断函数是is_null. 出错并不可怕,但是最好把错误都完整的输出,这样调试就很容易了. 除了输出出错原因,还要输出匹配的文本和使用的正则,这样就很容易调试了. PHP代码 复制代码 代码如下: <?php if (is

  • 正则表达式截取字符串的方法技巧

    有这么一段字符串: [数字]字符串 结果 取  a=数字 b=字符串 截取方法1: int a = Convert.ToInt32(txt1.Text.Trim().Replace('[', ']').Split(']')[1]); string b = txt1.Text.Trim().Replace('[', ']').Split(']')[2]; 截取方法2: string str = "[数字]字符串"; Regex reg = new Regex(@" ([^]+)

  • 正则表达式链接替换函数的技巧

    正则表达式链接替换函数的技巧如下所示: 1) 字符串       前面的字符<a href="http://www.aaa.cn/000011.html">任意长度字符</a>后面的字符 替换成        前面的字符<a href="http://www.bbb.cn/folder/show.asp?id=000011">任意长度字符</a>后面的字符 2) 字符串       前面的字符<a href=&q

  • 正则表达式优化JSON字符串的技巧

    json字符串很有用,有时候一些后台接口返回的信息是字符串格式的,可读性很差,这个时候要是有个可以格式化并高亮显示json串的方法那就好多了,下面看看一个正则表达式完成的json字符串的格式化与高亮显示 首先是对输入进行转换,如果是对象则转化为规范的json字符串,不是对象时,先将字符串转化为对象(防止不规范的字符串),然后再次转化为json串.其中json为输入. if (typeof json !== 'string') { json = JSON.stringify(json); } el

  • PHP 正则表达式的几则使用技巧

    我的PHP正则入门,是起源于网上的一篇文章,这篇文章由浅入深的阐述了PHP正则表达式使用的方法,我觉得是一个很好的入门材料,不过学成还是要 靠个人,在使用的过程中,还是会不断地忘记,因此反反复复的阅读了这篇文章有四五遍,对于其中一些比较困难的知识点,甚至要用很久才能消化,但是只要能见 坚持着看完,你会发现自己对于正则的运用能力就会显著提高. PHP正则表达式的定义: 用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作. PHP中的正则函数: PHP中有两套

  • php中常用的正则表达式的介绍及应用实例代码

    更全面的实例,可以参考最常用的PHP正则表达式收集整理http://www.jb51.net/article/14049.htm php 正则表达式小结http://www.jb51.net/article/19831.htm PHP 正则表达式的几则使用技巧http://www.jb51.net/article/19832.htm 以下内容为php中常用的正则,正则是一门通用性的语法,可以在网上下载更全面的正则,提供学习! 作用:分割,匹配,查找,替换 1,php中两个常用的正则函数 preg

  • python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解

    这篇博客是自己<数据挖掘与分析>课程讲到正则表达式爬虫的相关内容,主要简单介绍Python正则表达式爬虫,同时讲述常见的正则表达式分析方法,最后通过实例爬取作者的个人博客网站.希望这篇基础文章对您有所帮助,如果文章中存在错误或不足之处,还请海涵.真的太忙了,太长时间没有写博客了,抱歉~ 一.正则表达式 正则表达式(Regular Expression,简称Regex或RE)又称为正规表示法或常规表示法,常常用来检索.替换那些符合某个模式的文本,它首先设定好了一些特殊的字及字符组合,通过组合的&

  • 详解可以用在VS Code中的正则表达式小技巧

    你是不是一直都想学正则表达式,但是因为它的复杂性而被推迟了?在本文中,我将向你展示五个易于学习的正则技巧,你可以立即在自己喜欢的文本编辑器中使用它们. 文本编辑器设置 虽然现在几乎所有的文本编辑器都支持正则表达式,但我在本教程中用的是 Visual Studio Code,不过你可以使用任何你喜欢的编辑器.另请注意,你通常需要在搜索输入框附近的某处打开 RegEx 开关.以下是在 VS Code 中执行此操作的方法: 你需要通过选中此选项启用RegEx 1) .  -  匹配任何字符 让我们开始

  • Python 实用技巧之正则表达式查找和替换文本的操作方法

    1.需求 我们想对字符串中的文本做查找和替换. 2.解决方案 对于简单的文本模式,使用str.replace()即可. 例如: text='mark ,帅哥,18,183 帅,mark' print(text.replace('18','19')) print(text) 运行结果: mark ,帅哥,19,193 帅,mark mark ,帅哥,18,183 帅,mark 针对更为复杂的模式,可以使用re模块中的sub()函数. 实例:将日期格式从"11/28/2018"改为&quo

  • 一篇文章了解正则表达式的替换技巧

    目录 1.正则表达式应用——替换指定内容到行尾 2.正则表达式应用——数字替换 3.正则表达式应用——删除每一行行尾的指定字符 4.正则表达式应用——替换带有半角括号的多行 5.正则表达式应用——删除空行 6.正则表达式应用——实例应用 总结 1.正则表达式应用——替换指定内容到行尾 原始文本如下面两行 abc aaaaa123 abc 444 希望每次遇到“abc”,则替换“abc”以及其后到行尾的内容为“abc efg” 即上面的文本最终替换为: abc efg123 abc efg 解决:

随机推荐