Php 从大小不同的字符串的多个部分获取文本,并将其转换为变量

Php 从大小不同的字符串的多个部分获取文本,并将其转换为变量,php,Php,我试图获取字符串的特定部分,将它们转换为变量。我可以使用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\

我试图获取字符串的特定部分,将它们转换为变量。我可以使用
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类型:&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";

我想你应该用正则表达式来表达这个。诸如此类:

<?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)
);


我猜您应该使用正则表达式来处理这个问题。诸如此类:

<?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)
);


非常感谢您,我可以使用->
echo parseFoo($input)['MSI']输出它等等!关于这个
[“p INSTALL DIR”]=>字符串(6)
它将p from转储到下一个键中?出于某种原因
媒体ZIP文件:\\123.456.78.9\Path\TO\MY\MSI\MSI helpv1.0。ZIP正在从数组中剥离出来,p from ZIP在那里结束->
[“p INSTALL DIR”]
我现在修复了大部分问题,我没有考虑路径中的空格!非常感谢您,我可以使用->
echo parseFoo($input)['MSI']输出它等等!关于这个
[“p INSTALL DIR”]=>字符串(6)
它将p from转储到下一个键中?出于某种原因
媒体ZIP文件:\\123.456.78.9\Path\TO\MY\MSI\MSI helpv1.0。ZIP正在从数组中剥离出来,p from ZIP在那里结束->
[“p INSTALL DIR”]
我现在修复了大部分问题,我没有考虑路径中的空格!