gpt4 book ai didi

php - 将括号之间以逗号分隔的文本解析为键值对数组

转载 作者:行者123 更新时间:2023-12-02 15:46:10 26 4
gpt4 key购买 nike

我正在尝试解析以这种格式构造的 1 行:

Files("textfile1.txt", 7268474425, "textfile2.txt", 661204928, "textfile3.txt", 121034)

我使用命名捕获组在 C# 中完美地工作,但这是 PHP 并且严格按照主题进行。所以我不知道如何分离每个字段并构建一个我可以迭代的关联数组。

我可以使用双引号“textfile1.txt”检索第一项

$string = 'Files("textfile1.txt", 7268474425, "textfile2.txt", 661204928, "textfile3.txt", 121034)';
preg_match("/(?:(?:\"(?:\\\\\"|[^\"])+\")|(?:'(?:\\\'|[^'])+'))/is", $string, $match);
print_r($match);
Array
(
[0] => 'textfile1.txt'
)

我想不通。我尝试了不同的表达式来同时考虑字符串/长字段,但没有成功。

有什么我想念的吗?

最终结果是将每个文件名/大小添加到数组中以供以后访问。

感谢任何帮助

https://regex101.com/r/naSdng/1

我的 C# 实现如下所示:

MatchCollection result = Regex.Matches(file, @"(?:\G(?!\A)\s*,\s*|\w+\()(?:""(?<filename>.*?)""|'(?<filename>.*?)')\s*,\s*(?<filesize>\d+)");
matchCol = result;
foreach (Match match in result)
{
ListViewItem ItemArray = new(new string[] {
match.Groups["filename"].Value.Trim(), BytesToReadableString(Convert.ToInt64(match.Groups["filesize"].Value)), "Ready"
});
fileList.Items.Add(ItemArray);
}

最佳答案

您在 C# 中显示的正则表达式也可以很容易地适用于 PHP。

您可以使用:

(?:\w+\(\h*|(?<!\A)\G\h*,\h*)"(?<filename>[^"]+)"\h*,\h*(?<filesize>\d+)

请注意,我对您的正则表达式进行了一些重构以使其更高效。

RegEx Demo

Code Demo

代码:

<?php
$s = 'Files("textfile1.txt", 7268474425, "textfile2.txt", 661204928, "textfile3.txt", 121034)';

if (preg_match_all('/(?:\w+\(\h*|(?<!\A)\G\h*,\h*)"(?<filename>[^"]+)"\h*,\h*(?<filesize>\d+)/', $s, $m)) {
$out = array_combine ( $m['filename'], $m['filesize'] );
print_r($out);
}
?>

输出:

Array
(
[textfile1.txt] => 7268474425
[textfile2.txt] => 661204928
[textfile3.txt] => 121034
)

正则表达式详细信息:

  • (?: : 启动一个非捕获组
    • \w+\(\h* : 匹配 1+ 个单词字符后跟 (和 0 个或多个空格
    • | : 或者
    • (?<!\A)\G : 从上一场比赛结束开始比赛
    • \h*,\h* : 匹配被 0 个或多个空格包围的逗号
  • ) : 结束非捕获组
  • "(?<filename>[^"]+)" : 将双引号字符串与命名捕获组 filename 匹配匹配 1+ 个不是 " 的任何字符
  • \h*,\h* : 匹配被 0 个或多个空格包围的逗号
  • (?<filesize>\d+) : 命名捕获组 filesize匹配 1 个以上的数字

关于php - 将括号之间以逗号分隔的文本解析为键值对数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74134300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com