php – 从捕获的组中提取值

我有这个RegEx

^(?:([0-9]+) X,)?(?: )?(?:([0-9]+) Y,)?(?: Z)?$

我所做的是检查以下模式:

66 X, 55 Y, Z
66 X, 55 Y,
66 X, Z
55 Y, Z
66 X,
55 Y,

第1组是66 X,

第2组是55 Y,

我想要做的是拉取值并使用以下内容检查它:

if (isset($group_1)) {
    echo $group_1;
} else {
    echo 'null';
}
echo ' - ';
if (isset($group_2)) {
    echo $group_2;
} else {
    echo 'null';
}

根据模式获得如下结果:

66 - 55
66 - 55
66 - null
null - 55
66 - null
null - 55

我怎么能用PHP做到这一点?

解决方法:

使用preg_match(_all)?函数你有一个数组作为返回值.您可以这样使用该数组:

// An unnecessary non-capturing group removed 
$re = '/^(?:([0-9]+) X,)? ?(?:([0-9]+) Y,)?(?: Z)?$/m';
// Preparing Feeds
$str = <<<_
66 X, 55 Y, Z
66 X, 55 Y,
66 X, Z
55 Y, Z
66 X,
55 Y,
\n
_;

// `PREG_SET_ORDER` flag is important
preg_match_all($re, $str, $matches, PREG_SET_ORDER);

// Iterate over matches
foreach ($matches as $match) {
    // Remove first value off array (whole match)
    unset($match[0]);
    // Add `null` to existing empty value or the one that is not captured
    foreach (['null', 'null'] as $key => $value) {
        if (!isset($match[$key + 1]) || $match[$key + 1] === '')
            $match[$key + 1] = $value;
    }
    // Implode remaining values
    echo implode(" - ", $match), PHP_EOL;
}

输出(Live demo):

66 - 55
66 - 55
66 - null
null - 55
66 - null
null - 55
null - null

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...