[译文]PHP 正则表达式入门 Getting Started with PHP Regular Expressions

2023-11-09

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

译者注:

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

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

目录

英语原文链接

1. 什么是正则表达式

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

img

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

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

2. Perl兼容的正则表达式

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

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

在PHP中,每个PCRE函数都以 preg_ 开头,例如 preg_matchpreg_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 中使用正则

img

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

最常用的两个函数是 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('/\b(\w+)\s\1/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. 相关参考书目

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.


译者追加

语法速览表

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[译文]PHP 正则表达式入门 Getting Started with PHP Regular Expressions 的相关文章

  • 为什么 PHP 中不允许“传统”类型提示?

    刚刚发现类型提示 http php net manual en language oop5 typehinting phpPHP 中允许 但不适用于整数 字符串 布尔值或浮点数 为什么 PHP 不允许对整数 字符串等类型进行类型提示 从 P
  • Pure Bash 替换捕获组

    我有这个示例字符串 test string 13A6 该字符 数字可以是从 0 到 9 以及从 A 到 F 我想要这个输出 1 3 A 6 我有这个工作 result echo test string sed s g 我想在没有 sed 的
  • PHP - 扩展 __construct

    我想知道你是否可以帮助我 我有两个类 一个扩展了另一个 B 类将由各种不同的对象扩展 并用于常见的数据库交互 现在我希望 B 类能够处理其连接和断开连接 而无需来自 A 类或任何外部输入的指示 据我了解 问题是扩展类不会自动运行其 cons
  • RegularExpressionAttribute - 如何使其客户端验证不区分大小写?

    我有一个用于客户端验证的字符串 private const String regex b d 5 s s d 5 A Z 2 d 3 s s 1 d 3 s 我在我的中使用这个字符串 RegularExpression regex Erro
  • 如何在 WordPress 中按类别获取所有帖子

    我想在 WordPress 中按类别获取帖子 args array post type gt project postslist get posts args 0 gt WP Post 对象 ID gt 421 post author gt
  • 来自本地 XML 的模拟 SoapClient 响应

    我想用文件中的 XML 来模拟 SoapClient 的响应 我如何创建一个 stdClass 对象 就像 SoapClient 从文件返回一样 客户端已经包装了 SoapClient 因此可以轻松模拟响应 我的模拟是这样的 soapCli
  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • Python 非贪婪正则表达式

    我如何制作一个像这样的Python正则表达式 这样 给定 a b c d e 蟒蛇匹配 b 代替 b c d 我知道我可以使用 代替 但我正在寻找一种更通用的解决方案 使我的正则表达式更加干净 有没有办法告诉python 嘿 尽快匹配这个
  • 正则表达式最多匹配五个单词

    我有一个正则表达式 a zA Z 0 9 1 5 它验证该单词包含字母数字字符和少数特殊字符 并且长度不应超过5人物 如何使此正则表达式接受最多五个与上述正则表达式匹配的单词 a zA Z 0 9 1 5 s a zA Z 0 9 1 5
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • Yii2 中 init() 和 __construct() 方法有什么区别

    init 方法 public function init construct method public function construct 那么 它们之间有什么区别 应该使用哪一个呢 init 是从以下对象扩展的任何对象的方法yii b
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • PHP 错误警告:参数 1 应该是引用

    我 熟悉 PHP 我的朋友的网站因错误而崩溃 Warning Parameter 1 to Some function name expected to be a reference value given in public html i
  • wordpress - 像 stackoverflow 中那样内嵌 ajax 注释

    我有一个 WordPress 博客 希望为人们提供与 stackoverflow 中添加评论相同的用户体验 有很多评论 ajax 插件 但我找不到一个可以使用的插件 它允许您在主页上内联 进入并添加评论 而无需先深入到单独的单个帖子页面 任
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • 正则表达式的 o 修饰符是什么意思?

    Ruby 正则表达式有一些选项 例如i x m o i例如 意味着忽略大小写 什么是o选项是什么意思 在ri Regexp 它说o意味着执行 仅插值一次 但是当我这样做时 a one b a a two b不改变 它保持 one 我缺少什么
  • 接口中的构造方法

    接口中的构造方法不好吗 为什么人们认为有人想要实例化接口 我们想要做的是强制实现者实现构造函数 就像其他接口方法一样 接口就像一个合同 假设我有一个接口 Queue 并且我想确保实现者创建一个带有一个参数的构造函数 该构造函数创建一个单例队
  • Doctrine DQL 从 join 返回平面数组

    我通过 DQL 中的常规 LEFT JOIN 选择 3 个实体 它们通过连接表关联 连接表还定义了实体以及带注释的关系 查询执行没有问题 但我的结果作为平面数组返回 我期望一个包含三个实体作为每个索引的数组元素的数组 SELECT e1 e
  • 谷歌日历手表过期时间超过1个月怎么办?

    我将我的 CRM 系统与 Google 日历同步 为此 我要求push notifications从我的用户 Google 日历到我的系统 我已经成功创建了手表 并将过期时间设置为2030年 但是当我收到手表事件的响应时 它显示手表的过期时
  • 如何在 PHP 中从字符串类名实例化? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何创建返回方法名称的新实例 不幸的是我收到这个错误 错误 类名必须是有效的对象或字符串 这是我的代码 class Foo public f

随机推荐

  • 5.4.1 虚拟专用网VPN

    5 4 1 虚拟专用网VPN 我们已经学习了因特网的路由协议 5 3 1 因特网的路由协议 一 5 3 2 因特网的路由协议 二 基于距离向量算法的RIP协议 5 3 3 因特网的路由协议 三 OSPF协议 5 3 4 因特网的路由协议 四
  • TCP滑动窗口 和 拥塞窗口

    结论 滑动窗口 表征发送端和接收端的接收能力 拥塞窗口 表征中间设备的传输能力 TCP滑动窗口 需要说明一下 如果你不了解TCP的滑动窗口这个事 你等于不了解TCP协议 我们都知道 TCP必需要解决的可靠传输以及包乱序 reordering
  • 计算智能:不确定知识与推理

    不确定性 简单来说 不确定性指的是条件A不能100 推导出结论B 不确定性是现实问题中的常态 比如说医学中症状向疾病的推导等等 信度是智能体主动提供的对于相关命题的信心 它来自于已经接受到的感知信息 智能体获得新的感知信息后 其概率评估应得
  • 语雀导出知识库内所有文档为markdown格式备份

    语雀 写在前面 本复刻版本无法提交issue 有问题欢迎到语雀评论区和我交流 我一般不看csdn的评论 需要找我请到语雀文章评论区 欢迎给我的语雀文档点赞 或者给我复刻的仓库star 另外我想说明一下 复刻这个仓库的目的是为了防止重要的笔记
  • navigator对象

    navigator 对象是 JavaScript 中的一个内置对象 表示当前浏览器的信息和状态 它提供了访问浏览器相关信息的属性和方法 下面是一些 navigator 对象的常见属性和方法 navigator userAgent 返回包含浏
  • MySQL慢查询日志总结

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录 它用来记录在MySQL中响应时间超过阀值的语句 具体指运行时间超过longquerytime值的SQL 则会被记录到慢查询日志中 longquerytime的默认值为10
  • 在ubuntu18.04下安装 elsasticsearch-head 插件

    下载链接地址为 https github com mobz elasticsearch head archive master zip 下载命令如下 下载完成之后使用 unzip master zip 命令对下的压缩包进行解压 查看node
  • Qt连接远程SqlServer数据库,遍历结果集速度慢

    如题 我用qt连接远程的sqlserver数据库 一共110条数据 查询的时候遍历结果非常慢 达到十几秒左右 一开始我以为是结构体本身的问题 把结构体里面的赋值函数参数改成引用传递后 速度有所改善 缩短到9秒左右 但是并没有改变根本 最后我
  • AES-GCM加密算法的简单介绍

    一 什么是AES加密 常见的加密主要分为两类 对称加密和非对称加密 AES加密就是对称加密的一种 即加密和解密使用相同的一把密钥 它的全称是Advanced Encryption Standard 高级加密标准 主要是用来取代DES加密算法
  • mobx v6 + react hook 状态管理配置

    react hook 风格下不再使用class类的形式定义组件 也就不再适用mobx以前版本的装饰器语法 以下分享 reack hook 语法风格下使用 mobx v6 版本的状态管理配置使用方式 相关依赖版本 react 17 0 2 m
  • Spark基本概念

    Application 指的是用户编写的Spark应用程序 代码 包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码 Driver Spark中的Driver即运行行数Application的Main 函数并且创建
  • 为什么一个mac可以对应多个ip_路由器、交换机、IP、MAC原来可以这样理解

    先理解它们能够代表着什么 数据帧 快递 二层MAC地址 你的身份证号 全球唯一 三层IP地址 你的当前的住宅地址 你随时可能会搬去其他地址住额外的 规则 一个住宅地址只能住一个人 否则会导致收发快递不正常 交换机 给你派件的快递员 但是只认
  • CTFSHOW 萌新计划web9-15

    题目地址 http ctf show 0x01 web9 乍一看别被迷惑了 这个正则是字符串中包含 system exec highlight才能执行eval if preg match system exec highlight i c
  • 如何用logging记录python实验结果?

    做python实验有时候需要打印很多信息在控制台 console 但是控制台的信息不方便回顾和保存 故而可以采用logging将信息存储起来 先新建一个文件message log 代码如下 import logging logging ba
  • Android Studio 守护进程 错误 Error:Unable to start the daemon process....

    简介 有段时间没有使用Android Studio 最近使用AS打jar包的时候 不知道什么原因 突然出现了的问题 下面也没有详细的错误信息 网上很多解决类似问题的做法都是说AS在启动Jvm时候的空间问题 然而这个问题的下划线下面是有更详细
  • 航天生物计算机作文,科幻遨游太空作文(精选6篇)

    科幻遨游太空作文 精选6篇 导语 很多人语文成绩上不去 都是因为作文分数一直提不上去 为了让您在写作文时更加简单方便 下面是小编为大家收集的科幻遨游太空作文 精选6篇 欢迎大家借鉴与参考 希望对大家有所帮助 遨游太空作文1 太空 是一个充满
  • SQL触发器

    触发器 触发器是与表有关的数据库对象 可以在 insert update delete 之前或之后 触发并执行触发器中定义的SQL语句 触发器的这种特性可以协助应用在数据库端确保数据的完整性 日志记录 数据校验等操作 使用别名 NEW 和
  • 微信小程序之用camera实现类似扫码枪连续扫码

    微信小程序之用camera实现类似扫码枪连续扫码 搜了CSDN里面的文章 除了有一篇有关微信小程序 用微信小程序里面代码实现 扫码的功能 其它都是用别的 原博文是 小程序连续扫码实现但是他只是实现了一次扫码后就不能再继续扫码了 在js代码部
  • 组件库系列四:组件封装思路

    文章目录 按钮 输入框 tabs选项卡 toast提示 Popover 遇到的问题 前面已经有按钮为例子搭建的组件库 这里记录几个组件的封装思路 持续更新 按钮 感觉涟漪效果挺有趣的 就加进来了 简单分析一下 在按钮组件中使用canvas组
  • [译文]PHP 正则表达式入门 Getting Started with PHP Regular Expressions

    PHP 正则表达式入门 Getting Started with PHP Regular Expressions 译者注 本文是面向0正则基础的phper 很多正则的高级使用都没有涉及到 仅仅是一份简单的入门 对于有基础的 可直接查看本文末