使用PHP8,我正在努力找出如何有条件地匹配一些可能出现在字符串中或可能不出现在字符串中的键. 我想要两个都匹配的

-----------key=xyz---------------

--------------------------

破折号("-")可以是任何非空格字符,这里仅用于清洁工阅读示例.

正则表达式匹配"key=..."如果它的包含组是贪婪的,如下所示. 但这是不够的,因为完全匹配将失败,因为"key=xyz"缺少主题字符串.

/
(\S*)?                 
(key\=(?<foundkey>[[:alnum:]-]*))
\S*
/x

如果捕获组是非贪婪,那么正则表达式将忽略与任何"key=xyz"匹配的键

/
(\S*)?                 
(key\=(?<foundkey>[[:alnum:]-]*))?
\S*
/x

我试着在这regex101 example中调试,但没有弄清楚.

我使用多个正则表达式解决了这一问题,但希望有人能帮助解决我的误解,这样我就知道如何将其作为一个正则表达式来工作. 谢谢

推荐答案

您可以使用:

/
^
\S*?
(?:
   key=(?<foundkey>\w+)
   \S*
)?
$
/xm

RegEx Demo

RegEx Breakdown:

  • ^:开始
  • \S*?:匹配0个或更多非贪婪空格
  • (?:: Start Lookahead
    • key=(?<foundkey>\w+):匹配key=个文本,后跟1+个单词字符作为捕获组foundkey
    • \S*:匹配0个或更多空格
  • )?:结束向前看.?使其成为可选匹配
  • $;结束

Php相关问答推荐

Symfony Monolog:使用多个格式化程序

在保留唯一键值对的情况下高效合并嵌套数组

具有重叠捕获组的PHP正则表达式

在WooCommerce中禁用特定日期之前的免费送货

如何在函数中定位WooCommerce产品循环

如何将WooCommerce产品属性术语名称显示为链接术语?

将WooCommerce WC_Order对象与wp_Schedule_Event一起使用

函数存储到变量中

从WooCommerce订单项目获取Dokan卖家详细信息

Regex|PHP捕获json字符串中的每个非法双引号

将一个表中的行连接为不同表MYSQL中的一列

htaccess 重定向子域错误的 url

AWS S3:当对象名称包含 % 时复制对象失败并出现错误 - 无效的复制源编码

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

提交仅包含活动详细信息选项卡表单的主表单

如何在 Laravel 中修改嵌套数组的键?

Laravel 8:会话不适用

正则表达式 (php) 匹配单个 [ 或单个 ] 但忽略 [[ ]] 之间的任何内容?

从 CSV 文件 seeder 数据库时的额外行

Laravel Websockets 错误:(WebSocket 在建立连接之前关闭)