商城首页欢迎来到中国正版软件门户

您的位置:首页 >输入: `(A > 10) AND (B < 5) OR (C = "yes")` 输出: 条件:A > 10, B < 5, C = "yes"

输入: `(A > 10) AND (B < 5) OR (C = "yes")` 输出: 条件:A > 10, B < 5, C = "yes"

  发布于2026-04-16 阅读(0)

扫一扫,手机访问

提取条件表达式中的多个条件及逻辑运算符

本文介绍如何使用 PHP 正则表达式从形如 if(conditionA==valueA-AND-conditionB==valueB-OR-conditionC==valueC) 的字符串中,精准提取所有条件子串(如 conditionA==valueA)以及中间的逻辑连接符(AND/OR),并以结构化数组形式返回。

本文介绍如何使用 PHP 正则表达式从形如 `if(conditionA==valueA-AND-conditionB==valueB-OR-conditionC==valueC)` 的字符串中,精准提取所有条件子串(如 `conditionA==valueA`)以及中间的逻辑连接符(`AND`/`OR`),并以结构化数组形式返回。

在处理动态条件语句(尤其是自定义规则引擎或低代码逻辑解析场景)时,常需将嵌套在 if(...) 中、以 -AND- 或 -OR- 分隔的条件表达式拆解为可编程操作的原子单元。直接用单次 preg_match 匹配整个结构往往难以兼顾条件与运算符的分离;更稳健的方式是两步正则处理:先提取括号内主体,再按带捕获的分隔符切分。

以下为推荐实现方案:

$string = "if(conditionA==valueA-AND-conditionB==valueB-OR-conditionC==valueC)";

// 第一步:匹配 if(...) 结构,提取括号内完整内容(不包含 if 和括号)
if (preg_match('/^if\((.+)\)$/', $string, $matches)) {
    $body = $matches[1]; // → "conditionA==valueA-AND-conditionB==valueB-OR-conditionC==valueC"

    // 第二步:使用 preg_split + PREG_SPLIT_DELIM_CAPTURE 拆分
    // 模式 \-(AND|OR)\- 会匹配 "-AND-" 或 "-OR-",并捕获其中的 AND/OR
    $parts = preg_split('/\-(AND|OR)\-/', $body, -1, PREG_SPLIT_DELIM_CAPTURE);

    print_r($parts);
}
// 输出:
// Array
// (
//     [0] => conditionA==valueA
//     [1] => AND
//     [2] => conditionB==valueB
//     [3] => OR
//     [4] => conditionC==valueC
// )

关键点说明:

  • PREG_SPLIT_DELIM_CAPTURE 是核心:它让分隔符中被 () 捕获的子模式(即 AND|OR)也作为独立元素保留在结果数组中,实现「条件 + 运算符」交替排列;
  • 正则 /^if\((.+)\)$/ 使用非贪婪匹配 .+ 即可满足需求(因结尾固定为 )),无需 U 修饰符;若需支持嵌套括号(如 if((a==b)-AND-c==d)),则需改用递归正则或词法分析,本例不涉及;
  • 若原始字符串可能含空格(如 if( a==1 -AND- b==2 )),建议在 preg_split 前对 $body 执行 trim(),或在正则中加入 \s*(例如 /\s*\-(AND|OR)\-\s*/)增强鲁棒性。

? 进阶提示:
获得 $parts 后,可轻松构建条件树或执行顺序校验:

$conditions = [];
$operators  = [];
for ($i = 0; $i < count($parts); $i++) {
    if ($i % 2 === 0) {
        $conditions[] = $parts[$i]; // 偶数索引为条件
    } else {
        $operators[] = $parts[$i];  // 奇数索引为 AND/OR
    }
}
// $conditions = ['conditionA==valueA', 'conditionB==valueB', 'conditionC==valueC']
// $operators  = ['AND', 'OR']

该方案简洁、可读性强,适用于绝大多数基于连字符分隔的条件解析场景,且易于扩展(如增加 NOT- 支持只需修改正则中的 (AND|OR) 为 (AND|OR|NOT))。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注