如何使用 preg_match_all() 获取子组匹配的所有捕获? [复制]

2024-03-20

更新/注意:

我想我可能正在寻找的是得到捕获一组 https://stackoverflow.com/questions/6571106/can-you-retrieve-multiple-regex-matches-in-javascript/6571139#6571139 in PHP.

参考:使用命名模式子例程的 PCRE 正则表达式。 https://stackoverflow.com/questions/4941259/pcre-regular-expressions-using-named-pattern-subroutines

(仔细读:)


我有一个包含可变数量段的字符串(简化):

$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well

我现在想匹配这些段并通过 matches 数组返回它们:

$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);

这只会返回last捕获组 2 的匹配:DD.

有没有一种方法可以检索所有子模式捕获(AA, BB, DD)用一个正则表达式执行?不是preg_match_all适合这个吗?

这个问题是一个概括。

这俩$subject and $pattern被简化。自然地有了这样的一般清单AA, BB, .. 使用其他函数(例如explode)或与$pattern.

但我特别询问如何返回所有子组匹配preg_...- 函数族。

对于现实生活中的情况,假设您有多个(嵌套)级别的不同数量的子模式匹配。

Example

这是一个伪代码示例,用于描述一些背景知识。Imagine下列:

令牌的常规定义:

   CHARS := [a-z]+
   PUNCT := [.,!?]
   WS := [ ]

$subjectget 基于这些进行标记化。标记化存储在标记数组中(类型、偏移量……)。

然后该数组被转换为一个字符串,每个标记包含一个字符:

   CHARS -> "c"
   PUNCT -> "p"
   WS -> "s"

因此,现在可以在令牌流字符串索引上运行基于令牌(而不是字符类等)的正则表达式。例如。

   regex: (cs)?cp

表达一组或多组字符,后跟标点符号。

由于我现在可以将自定义标记表示为正则表达式,因此下一步是构建语法。这只是一个例子,这是 ABNF 风格:

   words = word | (word space)+ word
   word = CHARS+
   space = WS
   punctuation = PUNCT

如果我现在编译语法words进入(令牌)正则表达式我希望自然地拥有每个的所有子组匹配word.

  words = (CHARS+) | ( (CHARS+) WS )+ (CHARS+)    # words resolved to tokens
  words = (c+)|((c+)s)+c+                         # words resolved to regex

到目前为止我可以编码。然后我遇到了一个问题,小组比赛只包含他们的最后一场比赛。

因此,我可以选择自己为语法创建一个自动机(我想阻止它以保持语法表达式通用),或者以某种方式让 preg_match 为我工作,这样我就可以省掉它。

基本上就是这样。也许现在可以理解为什么我简化了问题。


Related:

  • pcrepattern 手册页 http://regexkit.sourceforge.net/Documentation/pcre/pcrepattern.html
  • 使用 preg_match_all() 获取重复匹配 https://stackoverflow.com/questions/6579908/get-repeated-matches-with-preg-match-all

类似的线程:使用 preg_match_all() 获取重复匹配 https://stackoverflow.com/questions/6579908/get-repeated-matches-with-preg-match-all/24269775

检查所选答案,加上我的答案可能有用,我将在那里复制:

From http://www.php.net/manual/en/regexp.reference.repetition.php http://www.php.net/manual/en/regexp.reference.repetition.php :

当重复捕获子模式时,捕获的值是与最终迭代匹配的子字符串。

我个人放弃并打算分两步完成。

EDIT:

我在另一个线程中看到someone https://stackoverflow.com/a/24279157/2090822声称lookbehind方法能够做到这一点。

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

如何使用 preg_match_all() 获取子组匹配的所有捕获? [复制] 的相关文章

  • /bootstrap/start.php 中的 Laravel 错误:\Illuminate\Foundation\Application 未找到

    因此 我在开发服务器上安装了 Laravel php5 5 3 标准安装 安装了 mcrypt 并收到以下错误消息 Fatal error Class Illuminate Foundation Application not found
  • 编程语言语法中尾随逗号的历史

    许多编程语言允许在其语法中在列表中的最后一项后面使用尾随逗号 据说这样做是为了简化自动代码生成 这是可以理解的 作为示例 以下是 Java 中完全合法的数组初始化 JLS 10 6 数组初始值设定项 http java sun com do
  • 如何上传图像代码并将路径保存到mysql数据库中

    如何编写代码上传图像并将路径保存到mysql数据库中 我已经尝试过 但没有一个有效 一种方法是上传图像并将其存储在服务器上的文件夹中 并将名称保存到 mysql 数据库中 这是一个例子 首先我们将创建一个用于上传的表单 文件 html Up
  • 此集合实例 Laravel 关系中不存在属性 [X]

    我在 Laravel 5 6 中使用了很多 Realtions 当我添加 phonebooks 时 我看到所有关系都工作正常 一切都很好 但是当我尝试在视图中显示它们时 我得到了属性在此集合上不存在的错误 这是关系代码 public fun
  • 调用未定义的函数 MYSQL_NUM_ROWS() [重复]

    这个问题在这里已经有答案了 我正在尝试使用 php 验证登录 但收到此错误 致命错误 未捕获错误 调用 opt lampp htdocs social index php 100 中未定义的函数 MYSQL NUM ROWS 堆栈跟踪 0
  • 使用计数器作为变量名称的一部分来访问变量

    我尝试做类似的事情 cat1 array hello everyone cat array bye everyone for index 0 index lt 2 index echo cat index 1 当然是行不通的 我需要在这里改
  • 在 PHP $_SESSION 中存储数据不安全吗?

    根据我的理解 PHP 进程的行为并不像应用程序服务器进程 因此 执行脚本后 PHP 进程不会保留任何用户特定数据 相反 它将它们存储在用户的 cookie 中 所以无论我们存储在什么地方 SESSSION进入cookie 这是真的 如果是
  • Codeigniter - 检查用户是否已登录并存在(它是真实用户)

    我正在尝试在用户登录我的网站时为他们设置会话数据 因此 如果用户存在于数据库中 我将设置一个会话数据 例如 this gt session gt set userdata user exists 1 现在 每次我想检查用户是否存在并已登录时
  • PHP shell_exec 使用 ssh 运行 shell 脚本

    我有一个 shell 脚本 使用 ssh 和密钥连接到另一台机器 因此它不需要用户名和密码 当我从命令行运行这个脚本时 它工作正常 但是当我从 php shell exec 运行这个脚本时 它不起作用 如果我与 PHP 建立 ssh 连接并
  • 自动解析 PHP,将 PHP 代码与 HTML 分离

    我正在开发一个大型 PHP 代码库 我想将 PHP 代码与 HTML 和 JavaScript 分开 我需要对 PHP 代码进行多次自动搜索和替换 对 HTML 进行不同的搜索和替换 对 JS 进行不同的自动搜索和替换 有没有一个好的解析器
  • 使用composer create-project安装特定的laravel 5版本

    今天我尝试安装特定的 laravel 版本composer create project laravel laravel 5 1 8 your project name prefer dist 因为有些插件在5 1 9及以上版本有问题 但是
  • PHP 中的 GOTO 命令?

    我听说 PHP 计划引入 goto 命令的传言 它应该做什么 我尝试搜索了一下 但没有找到任何具有描述性的内容 我明白这不会是 GOTO 10 类似命令 They are not adding a real GOTO but extendi
  • 定义我自己的 BASE_PATH 与 set_include_path?

    我了解了函数set include path 一直以来 我在config php文件中定义了一个常量 define BASE PATH var www mywebsite public html 在所有后续的 php 文件中 我会像这样包含
  • 使用 PHP 比较两个字符串的相似度

    嘿伙计们 我想寻求一些解决方案 现在我有字典了单词 txt 这里有一些例子 happy laugh sad 我有俚语字符串 hppy 我想要搜索和匹配那个俚语字符串我的字典这意味着它将返回 happy 因为这些字符串参考 快乐 in 字典
  • 如何在 PHP 中使用 foreach 循环仅回显一次特定的多个相同记录?

    我在 PHP 中使用 foreach 循环得到这些输出 现在 foreach 内部的输出如下所示 PHP代码 table thead tr th ACCOUNT NUMBER th th CATEGORY th th AMOUNT th t
  • 向 tk103 GPS 跟踪器发送命令

    我正在使用 php 开发实时 GPS 跟踪器 Web 应用程序 跟踪器参考号是tk103 我可以从跟踪器接收信息并将其存储到数据库中 设备的 GPRS 模式已启用 我的问题是 如何使用 php ini 将命令从服务器发送到设备 提前致谢 这
  • 在仅包含键的字符串的嵌套数组中查找值

    我有一个数组 其中包含一些设置 基本上如下所示 defaults array variable gt value thearray gt array foo gt bar myvar gt array morevars gt moreval
  • PHPExcel输出乱码

    我正在尝试 PHPExcel 附带的简单示例 01simple xls 我得到乱码输出 它 LibreOffice 想要导入文件 它认为字符集是西欧 DOS OS2 861 icelandic 输出是这样的
  • 在订单项目视图中显示自定义产品数据

    我在添加到购物车时遇到问题 我有一个具有不同定制条件的产品可供选择 当客户选择特定选项时 它添加到购物车 当客户选择另一种选择并添加时 它显示为购物车中的第二件商品 这没关系 但付款后 订单在第 1 项和第 2 项下均显示自定义选项 但没有
  • 是否需要使用fetch_object或fetch_array?

    我最近发现我可以打印数据库中的结果而不使用mysqli fetch object功能 例如 假设我们有一个简单的 sql select 语句 可以使用如下所示的语句来执行 conn mysqli connect localhost root

随机推荐

  • Emacs 是否可以运行位于远程服务器上的 Matlab shell?

    我希望能够使用 Matlab 模式 matlab el 来运行 matlab shell 唯一的问题是 Matlab 位于远程主机上 这可能吗 如果是这样 请解释一下 我现在正在和流浪汉玩 但没有成功 Thanks 我刚刚尝试通过 ssh
  • Task.Factory.StartNew 与 Task.Factory.FromAsync

    假设我们有一个 I O 绑定方法 例如进行数据库调用的方法 该方法可以同步和异步运行 那是 Sync IOMethod Async BeginIOMethod EndIOMethod 那么当我们以如下所示的不同方式执行该方法时 在资源利用率
  • 非平凡可复制类型的 C++ 值表示

    C 标准的当前草案 2019 年 3 月 有以下段落 basic types p 4 强调我的 T 类型对象的对象表示是 T 类型对象占用的 N 个 unsigned char 对象的序列 其中 N 等于 sizeof T T 类型对象的值
  • 在 JavaScript 块上使用 HTML 注释仍然有意义吗?

    过去 人们习惯将 HTML 注释标签包裹在 JavaScript 块周围 以防止 旧 浏览器显示脚本 即使 Lynx 足够聪明 可以忽略 JavaScript 那么为什么有些人仍然这样做呢 这些天有什么正当理由吗 编辑 我确实遇到过一种情况
  • 检查是否可以安全地评估符号

    我有一根绳子x 我觉得x是某个类型的子类型的字符串表示形式Number 例如 x可能会取值 Float64 我可以使用以下方法检查这一点 eval parse x lt Number 然而 有可能x包含一些危险的东西 比如一些变体 rm s
  • textFieldDidBeginEditing:没有被调用

    我从下面得到了代码this https stackoverflow com questions 1247113 iphone keyboard covers uitextfield所以问题 当我开始编辑时 我试图向上滑动文本字段 因为否则它
  • MySQL INT 含义

    我想知道如果我采用值为 8 的 INT 这是否意味着我只能从 1 到 99999999 或从 1 到 4294967295 UNSIGNED 该文档似乎对此非常清楚 数字类型属性 MySQL 支持选择性指定显示的扩展 基关键字后面的括号中的
  • CSRF - 仅在第一次登录

    当我在服务器上部署我的应用程序时 第一次我可以毫无问题地登录 但是当我注销时 我在注销发布请求中收到 403 Forbidden 然后我无法成功登录 因为我在登录请求上收到 403 错误 Ctrl F5 尝试再次登录 它可以工作 但只能一次
  • .NET 单委托与多播委托[重复]

    这个问题在这里已经有答案了 我深入阅读了一些有关委托的内容 令人困惑的是具有一种方法的委托可能与多播委托不同 然而 通过反射 您可以清楚地看到 即使只有一个方法 委托也确实派生自MulticastDelegate 并不是立即地源自于Dele
  • 在java中获取两个日期之间的天数[重复]

    这个问题在这里已经有答案了 您好 有两个日期格式的日期 如何获得两者之间的天数差异 Date date1 Date date2 int numberDays 建议使用 JodaTime API 来处理日期 import java util
  • 跳过 Laravel 的 FormRequest 验证

    我最近添加了已被攻击 https github com valorin pwned validator到我的表单请求类来检查破解的密码 鉴于这会进行外部 API 调用 有没有办法让我在测试期间完全跳过此验证规则或 FormRequest 类
  • catch 和finally 中抛出异常。 CLR 行为与 try-catch 块[重复]

    这个问题在这里已经有答案了 我编写了简单的 C 控制台应用程序 class Mystery static void Main string args MakeMess private static void MakeMess try Sys
  • 自定义地图类型:重复地图和标记。如何向地图添加填充?

    使用 Google Maps API v3 我为虚构的游戏世界创建了自定义地图类型 默认情况下 地图 甚至自定义地图类型 都会水平重复 见下图 Larger Image here https i stack imgur com 6cPuZ
  • 当有新版本可用时,Android 以编程方式更新应用程序

    在我的应用程序中 我想检查应用程序商店中是否有我的应用程序的任何更新版本 如果有的话 那么必须通过警报消息通知用户 如果他 她选择升级 我想更新新版本 我想通过我的应用程序完成这一切 这可能吗 我有同样的问题 但已通过 JSOUP 库解决
  • 如何让 nginx/gunicorn 使用结构化日志记录?

    我目前看到 172 19 0 1 09 Feb 2018 07 00 32 0000 GET ping HTTP 1 1 200 1 curl 7 47 0 在我的日志中 但我使用像这样的结构化日志记录 https stackoverflo
  • 防止桌子缠绕

    当表格位于外部表格单元格内部时 如何防止表格换行 看看我的问题底部的简化示例 我的 aspx tablerow tr td align left valign top br td tr
  • 使用 DropzoneJS 时获取文件内容

    我真的很喜欢 DropZoneJS 组件 目前正在将它包装在 EmberJS 组件中 您可以看到演示在这里 https ember cli dropzonejs firebaseapp com 无论如何 包装器工作得很好 但我想监听 Dro
  • `raise "foo"` 和 `raise Exception.new("foo")` 有什么区别?

    两者之间有什么区别 技术 哲学 概念或其他方面 raise foo and raise Exception new foo 从技术上讲 第一个会引发 RuntimeError 消息设置为 foo 第二个引发异常 消息设置为 foo 实际上
  • 通过 RPostgreSQL 将表从 R 导出到 PostgreSQL

    我在用RPostgreSQL我已经完成了一些过程 并且在 R 中得到了一个表 我想将该表从 R 放入 PostgreSQL 中 以便进一步分析 我将使用 PostgreSQL 代码 问题是 当我在 R 中有一个 PostgreSQL 中不存
  • 如何使用 preg_match_all() 获取子组匹配的所有捕获? [复制]

    这个问题在这里已经有答案了 更新 注意 我想我可能正在寻找的是得到捕获一组 https stackoverflow com questions 6571106 can you retrieve multiple regex matches