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