首页 > 解决方案 > 从大小不同的字符串的多个部分获取文本并将它们转换为变量

问题描述

我正在尝试获取字符串的特定部分以将它们转换为变量。我可以用来str_replace()获得我想要的输出,但由于它的长度会发生变化,尤其是文件路径,所以它不会削减它。

字符串模板:

$issue->fields->description = "MSI: YES XPF: NO PKG TYPE: XYZ VENDOR: WXYZ USER CODE: AB APP NAME: ATBTOOL VERSION: 1.0 MEDIA ZIP FILE: \\123.456.78.9\Path\TO\MY\MSI\MSIHelpV1.0.zip INSTALL DIR: G:\MSI EXISTING: NO";

此模板始终保持不变,并且当此数组被转储时,值周围总是有一个空格。我试图抓住的价值是:



XYZ
WXYZ
AB
ATBTOOL
1.0
\123.456.78.9\Path\TO\MY\MSI\MSIHelpV1.0.zip
G:\MSI

所以我想知道是否有任何东西可以指定在 MSI: & XPF:, PKG TYPE: & VENDOR: 之间获取所有内容,等等,任何帮助都将不胜感激!

这是我一直在使用的代码。

$stringPosPKG = strpos($issue->fields->description, 'TYPE');
                $stringPosVENDOR = strpos($issue->fields->description, 'VENDOR');
                $stringPosCODE = strpos($issue->fields->description, 'CODE');
                $stringPosAPP = strpos($issue->fields->description, 'APP');
                $stringPosVERSION = strpos($issue->fields->description, 'VERSION');
                echo "</br>";
                echo "PKG Begins At " . $stringPosPKG;
                echo "</br>";
                echo "VENDOR Begins At " . $stringPosVENDOR;
                echo "</br>";
                echo "CODE Begins At " . $stringPosCODE;
                echo "</br>";
                echo "APP NAME Begins At " . $stringPosAPP;
                echo "</br>";
                echo "VERSION Begins At " . $stringPosVERSION;
                echo "</br>";
                echo "</br>";
                $pkgType = substr( $issue->fields->description, 33, -217 );
                $vendorName = substr( $issue->fields->description, 48, -203 );
                $userCODE = substr( $issue->fields->description, 67, -184 );
                $appName = substr( $issue->fields->description, 83, -163 );
                $versionNum = substr( $issue->fields->description, 103, -147 );
                echo "</br>";
                echo "PKG Title: " . $pkgType;
                echo "</br>";
                echo "VENDOR Title: " . $vendorName;
                echo "</br>";
                echo "CODE CODE: " . $userCODE;
                echo "</br>";
                echo "APP NAME: " . $appName;
                echo "</br>";
                echo "VERSION: " . $versionNum;
                echo "</br>";
                $versionNumStrRArray = ["."];
                $versionNumStrR = str_replace($versionNumStrRArray, "_", $versionNum);
                echo "MSI NAME: MSI_" . $pkgType . "_" . $vendorName . "_" . $userCODE . "_" . $appName . "_" . "$versionNumStrR";

输出:

PKG Begins At 27
VENDOR Begins At 40
CODE Begins At 61
APP NAME Begins At 73
VERSION Begins At 94


PKG Title: ABC
VENDOR Title: WXYZ
CODE CODE: AB
APP NAME: ATBTOOL
VERSION: 1.0
MSI NAME: MSI_ABC_WXYZ_AB_ATBTOOL_1_0

标签: php

解决方案


猜猜你应该为此使用正则表达式。像这样的东西:

<?php

function parseFoo(string $foo): array
{
    $splitInput = [];

    preg_match_all(
        '/(?<key>[^\s][A-Z\s]+): (?<value>[\pL\pP\d]+)/',
        $foo,
        $splitInput
    );

    return array_combine(
        $splitInput['key'] ?? [],
        $splitInput['value'] ?? []
    );
};

$input = "MSI: YES XPF: NO PKG TYPE: XYZ VENDOR: WXYZ USER CODE: AB APP NAME: ATBTOOL VERSION: 1.0 MEDIA ZIP FILE: \\123.456.78.9\Path\TO\MY\MSI\MSIHelpV1.0.zip INSTALL DIR: G:\MSI EXISTING: NO";

echo json_encode(
    parseFoo($input)
);


推荐阅读