资讯专栏INFORMATION COLUMN

PHP 正则表达式入门 Getting Started with PHP Regular Expre

zhangke3016 / 2234人阅读

摘要:兼容的正则表达式已经实现了很多使用不同解析引擎的正则函数。中主要有两个正则解析器一个称为,另一个称为兼容正则表达式。在中,每个正则表达式模式都是使用符合格式的字符串。

原文链接: Getting Started with PHP Regular Expressions

Last-Modified: 2019年5月10日16:23:19

译者注:

本文是面向0正则基础的phper, 很多正则的高级使用都没有涉及到, 仅仅是一份简单的入门.

对于有基础的, 可直接查看本文末尾的正则表达式语法快速一览表(图) (不涉及修饰符)

译者追加 - 语法速览表

1. 什么是正则表达式

正则表达式(regex 或 regexp)的主要目的在于有效地搜索给定文本中的模式. 这些搜索模式使用正则表达式解析器理解的特殊格式编写。

正则表达式源自Unix系统中一个名为grep的程序,该程序是用于帮助用户处理字符串和操作文本。 通过遵循一些基本规则,我们可以创建非常复杂的搜索模式。

例如,你被赋予一项任务: 检查电子邮件或电话号码是否具有正确的格式。通过使用一些简单的命令,这些问题可以通过正则表达式轻松解决。 正则语法初学时并不那么简单,但是一旦你学会了它,你就会意识到你可以轻松地进行复杂搜索,只需键入简短的字符就可以从不同的角度处理问题。

2. Perl兼容的正则表达式

PHP已经实现了很多使用不同解析引擎的正则函数。PHP中主要有两个正则解析器,一个称为POSIX,另一个称为PCRE(Perl Compatible Regular Expression, Perl兼容正则表达式)。

POSIX的PHP函数前缀是 ereg_自从PHP 5.3发布后,这个引擎已被弃用,但让我们来看看更优,更快的PCRE引擎。

在PHP中,每个PCRE函数都以 preg_ 开头,例如 preg_match 或 preg_replace。您可以阅读PHP文档中的完整功能列表。

3. 基础语法

要使用正则表达式,你首先需要学习语法。该语法包含一系列字母,数字,点,连字符和特殊符号,我们可以使用不同的括号将它们组合在一起。

在PHP中,每个正则表达式模式都是使用符合 Perl 格式的字符串。在 Perl 中,在正斜杠之间写入正则表达式模式,例如 /hello/。在PHP中则是一个字符串 "/hello/"

现在,让我们看看一些运算符,它们是正则表达式的基本构建块。

语法 说明
^ ^ 标志着模式的开始,尽管在某些情况下它可以省略
$ 与 ^ 符号对应,$ 符号标志着搜索模式的结束
. 匹配任何单个字符
? 它将匹配前面的模式 0 或 1 次
+ 它将匹配前面的模式 1 或 更多 次
* 它将匹配前面的模式 0 或 更多次
布尔 或
匹配范围内的元素
() 将不同的模式元素组合在一起
[] 匹配中括号之间的任何单个字符
{min, max} 它用于匹配确切的字符数
d 匹配任何单个数字
D 匹配任何单个非数字
w 匹配单词字符, 包括下划线 _
W 匹配任何非单词字符
s 匹配空白符

作为PHP中的一个补充,使用简单的斜杠 来转义正斜杠字符。示例:"/he/llo/"

为了简要了解如何使用这些运算符,让我们看一些示例:

示例 说明
"/hello/" 匹配单词 hello
"/^hello/" 匹配处于字符串开头的 hello . 可能的匹配比如 hello, helloworld , 但不会匹配 worldhello
"/hello$/" 匹配处于字符串结尾的 hello
"/he.o/" 匹配任何位于 heo 的任何字符, 比如 helo , helo, heyo, 但不会匹配 hello
"/(he)?llo/" 匹配如 llohello
"/(hello)+/" 匹配 hello 一次或多次, 如 hello ,hellohello
"/(he)*llo/" 匹配 llo, hello, hehello, 但不会匹配 hellooo
`"/hello world/"` 匹配单词 helloworld
"/[A-Z]/" 匹配从 AZ 的大写字母
"/[abc]/" 匹配 a, b, c 中任意一个字符*
"/abc{1}/" ab 后精确匹配一个 c 字符, 如 abc, 但不匹配 abcc
"/abc{1,}/" ab 后匹配一个或多个 c字符, 如 abc , abcc
"/abc{2,4}/" ab 后匹配 2~4 个 c, 如 abcc, abccc, abcccc, 但不匹配 abc
译者注: 上面示例中原文存在一些错误, 此处已修正.

除了运算符之外,还有正则表达式修饰符,可以全局改变搜索模式的行为。

正则表达式修饰符放在模式之后,就像 "/hello/i" 一样,它们由单个字母组成,例如 i 表示模式不区分大小写, x 表示忽略模式中的空白字符。 关修饰符的完整列表,请访问PHP的在线文档。

正则表达式的真正功能在于组合这些运算符和修饰符,从而创建相当复杂的搜索模式。

4. 在 PHP 中使用正则

在PHP中,我们总共有九个PCRE函数可以使用。这是列表:

preg_filter – 执行一个正则表达式搜索和替换

preg_grep – 返回匹配模式的数组条目

preg_last_error – 返回最后一个PCRE正则执行产生的错误代码

preg_match – 执行匹配正则表达式

preg_match_all – 执行一个全局正则表达式匹配

preg_quote – 转义正则表达式字符

preg_replace – 执行一个正则表达式的搜索和替换

preg_replace_callback – 执行一个正则表达式搜索并且使用一个回调进行替换

preg_split – 通过一个正则表达式分隔字符串

最常用的两个函数是 preg_matchpreg_replace

让我们首先创建一个测试字符串,我们将在其上执行正则表达式搜索。经典的 Hello World 示例:

$test_string = "hello world";

如果我们只是想搜索单词hello或world,那么搜索模式将如下所示:

preg_match("/hello/", $test_string);
preg_match("/world/", $test_string);

如果我们希望查看字符串是否以单词 hello 开头,我们只需将 ^ 字符放在搜索模式的开头,如下所示:

preg_match("/^hello/", $test_string);

请注意,正则表达式区分大小写,上面的模式与单词 hElLo 不匹配。 如果我们希望模式不区分大小写,则应该应用以下修饰符:

preg_match("/^hello/i", $test_string);    

注意模式末尾正斜杠后面的字符 i

现在让我们来看一个更复杂的搜索模式。如果我们要确认字符串中的前五个字符由字母, 数字 组合,该怎么办?

preg_match("/^[A-Za-z0-9]{5}/", $test_string);

让我们剖析一下这种搜索模式 . 首先,通过使用 ^,我们指定该字符串必须以字母, 数字开头。这由 [A-Za-z0-9] 来指定。

A-Z 表示从A到Z的所有字符, a-z 则表示从 a到z的所有小写字符.

{5} 告知正则表达式解析器此处刚好有五个字符。如果是六个而不是五个,解析器匹配不到任何东西.

上述正则表达式可以优化为以下形式:

preg_match("/^w{5}/", $test_string);

w 表示任何字母, 数字, 包括下划线字符 _


5. 该章节不存在
译者注: 原文没有 5... 的确没有
6. 有用的正则函数

以下是一些使用正则表达式的PHP函数,您可以每天使用它们。

译者注: 实际上有其他更为方便的替代函数

比如验证邮箱可以使用 filter_var($email,FILTER_VALIDATE_EMAIL)

想了解更多的点击此处

6.1 验证e-mail

此函数将验证给定的电子邮件地址字符串,以查看其是否具有正确的格式。

function validate_email($email_address)
{
    if( !preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+
                     ([a-zA-Z0-9._-]+)+$/", $email_address))
    {
        return false;
    }    
    return true;
}
6.2 验证URL
function validate_url($url)
{
    return preg_match("|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?
                      (/.*)?$|i", $url);
}
6.3 移除重复的单词

我经常在文本中找到重复的单词,比如 this this。这个方便的函数功能可以删除这些重复的单词。

function remove_duplicate_word($text)
{
    return preg_replace("/(w+)s1/i", "$1", $text);
}

译者注: 原文处的正则表达式有误, 此处已修正. 以下是原文给出的函数:

function remove_duplicate_word($text)
{
    return preg_replace("/s(w+s)1/i", "$1", $text);
}
6.4 验证字母数字,短划线,下划线和空格
function validate_alpha($text)
{
    return preg_match("/^[A-Za-z0-9_- ]+$/", $text);
}
6.5 验证美国邮政编码
function validate_zip($zip_code)
{
    return preg_match("/^([0-9]{5})(-[0-9]{4})?$/i",$zip_code);    
}
7. 正则速查表 7.1 元字符
元字符 Description
^ 标记字符串的开头
$ 标记字符串的结尾
. 匹配任意单个字符
布尔或
() 组元素
[abc] 匹配 a,b,c 中任意一个
[^abc] 匹配除 a,b,c 外的任意一个
s 空白字符
a? 0 个或 1 个 a, 等同于 a{0,1}
a* 0 个或 多个 a
a+ 1 个或 多个 a
a{2} 精确匹配 2 个 a
a{,5} 最多 5 个 a
a{5,10} 匹配 5~10 个 a
w 单词字符, 等同于 [A-Za-z0-9_]
W 任何非单词字符
s 任何空白字符
S 任何非空白字符
d 任何数字, 等同于 [0-9]
D 任何非数字, 等同于 [^0-9]
7.2 模式修饰符
模式修饰符 说明
i 忽略大小写
m 多行模式
S 模式的额外分析
u 模式字符串被认为是 UTF-8 编码
译者注: 上述模式修饰符是大小写敏感的.

还有一部分修饰符原文没有列举出来, 毕竟只是面向入门

8. 相关参考书目

15 PHP Regular Expression for Web Developers

Mastering Regular Expressions in PHP

Introduction to PHP Regex

9. Author: Joel Reyes
译者注: 该部分不翻译

Joel Reyes Has been designing and coding web sites for several years, this has lead him to be the creative mind behind Looney Designer a design resource and portfolio site that revolves around web and graphic design.

Write for Us! We are looking for exciting and creative articles, if you want to contribute, just send us an email.


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31435.html

相关文章

  • [Regular Expression]Mastering Python Regular Expre

    摘要:续上基础通俗正则表达中两个重要对象如下图使用函数,返回为对象使用函数,如果到存在的结果,则返回对象,否则返回福利一个在线验证自己写的正则表达式是否正确的网站关于正则表达式中的如下图中的前加入字母表明里面的表达式已经是而前面加了,表明,在做之 续上:[Regular Expression]Mastering Python Regular Expression基础通俗(2) 1:Pyth...

    sihai 评论0 收藏0
  • [Regular Expression]Mastering Python Regular Expre

    摘要:续上基础通俗三类常用的的简写形式偷懒需要用来对某一类特定字符进行匹配,通常,我们用的最多的字符就是下面的三类数字,字母和这类看不到占位符,上一部分学过通过方括号表示这三类的的方法由于上面的表达试比较长,所以需要有一种更简单的写法可以 续上:[Regular Expression]Mastering Python Regular Expression基础通俗(1) 三类常用的meta...

    daydream 评论0 收藏0
  • PHP正则达式

    摘要:但在某些情况下,用正则表达式去验证一个字符串比较复杂和费时。验证信用卡号验证域名从特定中提取域名将文中关键词高亮显示对于开发人员来说,正则表达式是一个非常有用的功能,它提供了查找,匹配,替换句子,单词,或者其他格式的字符串。 正则表达式是程序开发中一个重要的元素,它提供用来描述或匹配文本的字符串,如特定的字符、词或算式等。但在某些情况下,用正则表达式去验证一个字符串比较复杂和费时。本文...

    Nekron 评论0 收藏0
  • Python实现命令行监控北京实时公交之一

    摘要:开头先放上效果展示在命令行输入,显示基本信息,如下在命令行输入,显示北京路公交车的位置,如下红色的说明在梅园附近有一辆公交车,并且会不断刷新。 开头先放上效果展示 在命令行输入 python bus.py -i,显示app基本信息,如下: showImg(https://segmentfault.com/img/bV8gmb?w=644&h=454); 在命令行输入 python bu...

    vboy1010 评论0 收藏0
  • PHP 正则达式

    摘要:规范为的缩写,中文即兼容正则表达式,由开发的库,为很多现代工具所使用,大多数编程语言的正则表达式也都是集成该规范。接下来本文会对规范的正则表达式作出详细介绍。正则语法分隔符当使用函数的时候,模式需要由分隔符闭合包裹。 概述 正则表达式(Regular Expression)是一种字符匹配工具,通过构建具有特定规则的模式,和输入字符串数据进行比较,然后进行匹配、分割、替换等等的相关操作。...

    rozbo 评论0 收藏0

发表评论

0条评论

zhangke3016

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<