Quick actions

cmd+k|ctrl+k

Navigation

Languages

parse expression []

Snippet info

Language

Php

Visibility

public

Author

zjmainstay

Created

2017-03-15T03:19:36Z

Updated

2017-05-04T06:35:35Z

<?php
//@author Zjmainstay
//@website http://www.zjmainstay.cn

$str = 'x<=3.54,2.1<=x,x<3.5,-4<x,x>Sqrt[Max[5,3]],Max[Log[2,Min[3,5]],Sqrt[Max[5,3]]]<=x,x>-6.3,x>=5.3,6.8>=x,3.2>x,x<Sqrt[3],x<2^(1/3),x<Max[2,4],x<Log[2,3],x<Min[2,Max[3.3,2]],x<Log[3,Min[2,Max[3.3,2]]]';
$expList = parseExp($str);
print_r($expList);

$matchList = getMatch($expList, '#x>=(.+)|(.+)<=x#');
$result = array();
foreach($matchList as $match) {
    $result[] = empty($match[1]) ? $match[2] : $match[1]; //如果匹配了分组1则取分组1的值,否则取分组2的值
}
print_r($result);

/**
 * 解析式子
 * @param  string $str 源字符串
 * @return array
 */
function parseExp($str) {
    $len = strlen($str);

    $parseList = array();
    $pair = 0;     //为0表示配对成功,遇[加一,遇]减一
    $exp = '';    //当前式子
    for($i = 0; $i < $len; $i++) {
        $exp .= $str[$i];   //拼接当前字符(利用数组下标的方式获取字符串,类似 substr($str, $i, 1))

        if($str[$i] == '[') {   //左[ 配对+1
            $pair ++;
        } else if($str[$i] == ']') { //右] 配对-1
            $pair --;
        } else if($str[$i] == ',' && $pair == 0) {  //找到, 且配对成功,认为式子完成
            $parseList[] = substr($exp, 0, -1);    //去掉逗号
            $exp = '';    //进入下一个式子匹配
        }
    }
    
    if(!empty($exp) && $pair == 0) {
        $parseList[] = $exp;
    }

    return $parseList;
}

/**
 * 获取式子匹配正则结果
 * @param  array $expList 式子数组
 * @param  string $pattern 正则
 * @return array
 */
function getMatch($expList, $pattern) {
    $matchList = array();
    foreach($expList as $item) {
        if(preg_match($pattern, $item, $match)) { //如果正则匹配成功,记录到命中数组
            $matchList[] = $match;
        }
    }

    return $matchList;
}
INFO