我在正则表达式上工作了几个小时.

location in [chambre, cuisine, salle-de-bain, jardin]

我只想在一个步骤中验证形状是否为[word,word,word…]我想抓住每一个单词.(为了提高性能,我只想在一个步骤中完成,因为这段代码已经有三个步骤了,但太长了)

我当前的正则表达式是:

/([a-zA-Z]+)\s+in\s+\[\s*([a-zA-Z-]+)\s*(?:,\s*([a-zA-Z-]+)\s*)*\s*\]/

我找到了位置、房间和花园.我不go 厨房和浴室

$condition = 'location in [chambre, cuisine, salle-de-bain, jardin]'
$analyse = preg_match('/([a-zA-Z]+)\s+in\s+\[\s*([a-zA-Z-]+)\s*(?:,\s*([a-zA-Z-]+)\s*)*\s*\]/',$condition, $matches);
var_dump($matches);
array:4 [▼
  0 => "location in [chambre, cuisine, salle-de-bain, jardin]"
  1 => "location"
  2 => "chambre"
  3 => "jardin"
]

我在正则表达式中找不到错误的地方来捕捉缺失的两个单词.我只得到数组中的第一个和最后一个...

推荐答案

在PHP中,重复捕获组总是只捕获最后一个子字符串.

你可以将preg_match_all与正则表达式一起使用,比如

[a-zA-Z]+(?=\s+in\s+\[\s*[a-zA-Z-]+(?:\s*,\s*[a-zA-Z-]+)*\s*])|(?:\G(?!^)\s*,\s*|(?<=[a-zA-Z])\s+in\s+\[\s*)\K[a-zA-Z-]+(?=(?:\s*,\s*[a-zA-Z-]+)*\s*])

regex demo.Details:

  • [a-zA-Z]+(?=\s+in\s+\[\s*[a-zA-Z-]+(?:\s*,\s*[a-zA-Z-]+)*\s*])-一个或多个ASCII字母后面紧跟着in,后面是一个或多个空格字符,然后是[,零个或多个空格,一个或多个ASCII字母或连字符,然后是零个或多个重复逗号,后面是零个或多个空格或连字符,然后是零个或多个空格和一个]字符
  • |-或
  • (?:\G(?!^)\s*,\s*|(?<=[a-zA-Z])\s+in\s+\[\s*)\K[a-zA-Z-]+(?=(?:\s*,\s*[a-zA-Z-]+)*\s*]):
    • (?:\G(?!^)\s*,\s*|(?<=[a-zA-Z])\s+in\s+\[\s*)-前一个匹配的结尾,逗号由零个或多个空格或紧跟ASCII字母的位置括起,然后是一个或多个空格、in、一个或多个空格、[和零个或多个空格
    • \K-省略到目前为止匹配的文本
    • [a-zA-Z-]+-一个或多个ASCII字母或连字符
    • (?=(?:\s*,\s*[a-zA-Z-]+)*\s*])-一种正向前瞻,需要零次或多次重复逗号,其中包含零个或多个空格、一个或多个ASCII字母或连字符、零个或多个空格和]个字符.

Php相关问答推荐

从产品中获取WooCommerce产品属性单选按钮的列表WP_Query

在php中有没有办法比较两个包含相同枚举类型的枚举数组

如何将对我的域的请求重定向到子文件夹中的索引,同时保留域URL并使用.htaccess?

WooCommerce在购买后多次重定向

根据WooCommerce中的客户计费国家/地区更改产品价格

将WooCommerce WC_Order对象与wp_Schedule_Event一起使用

根据发货类别在WooCommerce产品页面中显示快捷代码

如果所有请求都通过index.php路由,如何使用htaccess文件强制使用HTTPS?

使用 wp_footer 挂钩添加一些 CSS 不起作用

使用动态地址和动态文件创建zip文件并获取zip文件链接

在 WooCommerce 管理变量产品中启用其他变体图像

由于 PHP 版本不受支持,如何终止 PHP 脚本?

为WooCommerce中的Guest用户保存唯一的客户代码到订单中

Woocommerce的数量和价格条件

如何使用相同的变量使函数参数对于数组和字符串都是可选的

如何在供应商名称后将自定义徽章添加到商品详情

在 GA4 Data API V1 Beta 中使用 inListFilter 过滤器时出错

Docker: unixodbc.h 没有这样的文件或目录.已安装 unixodbc-dev 时出现pecl install sqlsrv错误

如果 static:: 被解析为B,为什么 PHP 会执行A的方法

在 EasyAdmin 中添加全局操作,将我的按钮放在表格下方而不是上方