gpt4 book ai didi

php - 使用 php regexp 重新排序字符串的行

转载 作者:可可西里 更新时间:2023-11-01 01:12:08 24 4
gpt4 key购买 nike

我需要使用 php regexp 对字符串中的行重新排序。但我不知道如何告诉 php 不要将同一行更改两次。让我解释一下。

输入字符串是:

$comment = "
some text

{Varinat #3 smth}
{Varinat #4 smth else}
{Varinat #1 smth else 1}
some another text
{Varinat #2 smth else 2}
{Varinat #5 smth else 5}
";

我需要订购变体:

$comment = "
some text

{Varinat #1 smth else 1}
{Varinat #2 smth else 2}
{Varinat #3 smth}
some another text
{Varinat #4 smth else}
{Varinat #5 smth else 5}
";

我有代码:

$variants = [
3 => 1,
4 => 2,
1 => 3,
2 => 4,
5 => 5,
];

$replacements = [];
foreach ($variants as $key => $variant) {
$replacements['/{Varinat #'.$variant.'\ /is'] = '{Varinat #'.$key . ' ';
}


$comment = preg_replace(array_keys($replacements), array_values($replacements), $comment);

echo $comment;

但它确实做了额外的改变:

some text

{Varinat #1 smth}
{Varinat #2 smth else}
{Varinat #1 smth else 1}
some another text
{Varinat #2 smth else 2}
{Varinat #5 smth else 5}

如您所见,第 1 行和第 2 行加倍了。发生这种情况是因为 php 确实发生了变化:3->1,然后是 1->3。

我只有丑陋的解决方案:将行更改为

3 => 1*,
4 => 2*,
1 => 3*,
2 => 4*,
5 => 5*,

然后删除*

有没有更优雅的解决方案?

最佳答案

为什么不构建一个算法来实际执行您想要执行的操作,即对 {Varinat 行进行排序?

$lines = explode("\n",$comment); // assuming $comment is your input here
$numbered_lines = array_map(null,$lines,range(1,count($lines)));
usort($numbered_lines,function($a,$b) {
if( preg_match('(^\{Varinat #(\d+))', $a[0], $match_a)
&& preg_match('(^\{Varinat #(\d+))', $b[0], $match_b)) {
return $match_a[1] - $match_b[1]; // sort based on variant number
}
return $a[1] - $b[1]; // sort based on line number
});
$sorted_lines = array_column($numbered_lines,0);
$result = implode("\n",$sorted_lines);

由于某些原因,上面的代码在 PHP 7 中不起作用。这里有一个替代方案。

$lines = explode("\n",$comment);
$processed = array_map(function($line) {
if( preg_match('(^\{Varinat #(\d+))', $line, $match)) {
return [$line,$match[1]];
}
return [$line,null];
}, $lines);
$variant = array_filter($processed,function($data) {return $data[1];});
usort($variant,function($a,$b) {return $a[1] - $b[1];});
$sorted = array_map(function($data) use (&$variant) {
if( $data[1]) return array_shift($variant)[0];
else return $data[0];
},$processed);
$result = implode("\n",$sorted);

这是通过首先用它的“变体”号标记每一行来工作的,如果它有的话。然后它将列表过滤到只有那些行并对它们进行排序。最后,它再次遍历所有行,并保持原样(如果它不是变体)或用下一个排序的变体行替换它。

> 在 3v4l 上演示

关于php - 使用 php regexp 重新排序字符串的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51554675/

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