gpt4 book ai didi

php - 在选择首先替换字符串部分的顺序时替换字符串

转载 作者:可可西里 更新时间:2023-11-01 00:30:49 25 4
gpt4 key购买 nike

我正在尝试用某些单词替换一个字符串,但我也想按照数组中的位置顺序替换它。例如,我想在尝试替换“a b”之前替换“b c”,而不改变原始字符串中的位置。顺便说一句,这些字母应该代表实际的单词,它们不应该是另一个单词的一部分。例如,“太阳”一词是“向日葵”的一部分,不能因为其中有“太阳”一词就替换“向日葵”一词。

$text = "a b c";
$replacement = array("a b" => "ab","b c" => "bc");
$search = array_map(function($v){
return preg_quote($v, "/");
}, array_keys($replacement));

echo $text = preg_replace_callback("/\b(" . implode("|", $search) . ")\b/", function($m)use($replacement){
return $replacement[$m[1]];
}, $text);

第一个结果

ab c 

第二个结果

我调换了数组中的位置,认为这会影响字符串被替换的顺序。遗憾的是,它不是那样工作的,我得到了相同的结果。

$replacement = array("b c" => "bc","a b" => "ab");
ab c

在这一点上,我意识到影响字符串的哪一部分首先被替换的不是数组的位置,而是显示在原始字符串上的字符串部分的顺序决定了顺序其中它被替换为。

所以,我的问题是,有没有办法让它可以根据字符串在数组中的顺序或以不同的方式按顺序替换字符串?比如我要替换

"b c"

在我尝试替换“a b”而不改变原始字符串的位置之前。那可行吗?谢谢。

最佳答案

[编辑]

这个想法包括将原始文本转换为一个数组(开头有一个元素,即文本)。偶数索引处的数组项针对每个模式进行拆分。由于使用了 PREG_SPLIT_DELIM_CAPTURE 选项,定界符的索引始终为奇数,并且在匹配后保持不变。

$text = 'a b c';
$rep = ['b c'=>'bc', 'a b'=>'ab', ];

$pats = array_map(function($i) {
return '~\b(' . preg_quote($i, '~') . ')\b~';
}, array_keys($rep));

$parts = (array)$text; // or $parts = [ $text ]; // it's the same

foreach ($pats as $pat) {
$temp = [];
foreach ($parts as $k=>$part) {
if ($k & 1)
$temp[] = $part;
else
$temp = array_merge(
$temp,
preg_split($pat, $part, -1, PREG_SPLIT_DELIM_CAPTURE)
);
}
$parts = $temp;
}

$result = '';
foreach ($parts as $k=>$part) {
$result .= ($k & 1) ? $rep[$part] : $part;
}

echo $result;

关于php - 在选择首先替换字符串部分的顺序时替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32405630/

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