更换除某些部件外的字符串

时间:2016-11-03 10:35:55

标签: php

我正在编写一个PHP应用程序,我有一个

形式的输入字符串
Hello world. Hello [fbes_keep]world[/fbes_keep].

表格中的新字符串

Hallo welt. Hello.

我希望输入字符串被新字符串替换,除了 [fbes_keep]标记中的部分,因此输出为

Hallo welt. Hello [fbes_keep]world[/fbes_keep].

我当前的方法涉及使用finediff library但重写删除操作码以查找fbes标记。昨天我问a question这个问题,但我觉得我可能遇到了XY问题。 有更好的方法吗?

编辑: Gist包含当前(非功能)代码和实际测试用例。

1 个答案:

答案 0 :(得分:0)

也许这不是最优雅的方式我该怎么做,但我已经测试了它,它完成了这项工作:

$expression = 'world';
$newExpression = 'welt';
$str = 'Hello world. Hello [fbes_keep]world[/fbes_keep]. Here are some other world, and [fbes_keep]other[/fbes_keep] word in fbes.';
$pattern = '/\[fbes_keep\].*?\[\/fbes_keep\]/i';
$fbKepps = [];
preg_match_all($pattern, $str, $fbKepps);
$others = preg_split($pattern, $str);
$result = '';
$i = 0;
foreach ($others as $other) {
    $result .= preg_replace('/' . addslashes($expression) . '/', $newExpression, $other);
    $i++;
    if ($i < count($others)) {
        $result .= $fbKepps[0][$i - 1];
    }

}
echo $result;

<强>输出

Hello welt. Hello [fbes_keep]world[/fbes_keep]. Here are some other welt, and [fbes_keep]other[/fbes_keep] word in fbes.

我的意思是将字符串拆分为[fbes_keep]...[/fbes_keep],但在将它们存储在数组中之前。然后迭代所有其余部分,将world更改为welt,然后将下一个fbes_keep连接起来,依此类推......

它保留了所有内容[fbes_keep]anything[/fbes_keep],并且有多个fbes_keep也可以与其他单词串在一起。