【问题标题】:PHP replace dynamic content based on position in stringPHP根据字符串中的位置替换动态内容
【发布时间】:2018-05-02 21:00:39
【问题描述】:

我想要什么:

要替换的值在{{}}之间。

输入: “这是字母 {{ A }} 和 {{ B }}”

但它可以改变:“这是字母 {{ AAAA }} 和 {{ BBB }}”

带数组(“C”,“D”)

输出:“这是字母C和D


我事先不知道{{ }} 之间的字符串,我想提取这些字符串并用另一个值替换它们:

我尝试了什么:

$body = "This is a body of {{awesome}} text {{blabla}} from a book.";


//Only work if we know the keys (awesome, blabla,...)
$text["awesome"] = "really cool"; 
$text["blabla"] = "";
echo str_replace(array_map(function($v){return '{{'.$v.'}}';},    array_keys($text)), $text, $body);

结果:

This is a body of really cool text from a book.

问题:

我找不到类似于这个已经问过的东西(只有当我们知道括号之间的旧内容之前,但我的内容是“动态的”),所以使用 array_map 的解决方案preg_replace_callback 不起作用。

知道我该怎么做吗?

【问题讨论】:

  • 那么,你的实际问题的例子是什么,而不是你已经解决了什么?你想在{{}} 之间执行代码,从对象中查找值还是什么?
  • 您要替换的字符串中有多少个带有{{}} 的单词?只有 2 个
  • @chris85 是的,它被标记为重复,我看到了您提供的链接,但我的问题不同(即使与已经提出的问题非常相似,我在发布问题之前已经阅读了所有答案,没有像我的问题)
  • @user2486 他们用“测试二”替换“测试”,在我的情况下我不知道“测试”
  • @chris85 我知道要替换什么值,因为它在 {{ }} 之间,所以我想用数组替换“这是字母 {{ A }} 和 {{ B }}”(“C ", "D")=> "这是字母 C 和 D"

标签: php regex preg-replace-callback


【解决方案1】:

我想这就是你所追求的:

$body = "This is a body of {{awesome}} text {{blabla}} from a book.";
$count = 0;
$terms[] = '1';
$terms[] = '2';
echo preg_replace_callback('/\{{2}(.*?)\}{2}/',function($match) use (&$count, $terms) {
    $return = !empty($terms[$count]) ? $terms[$count] : 'Default value for unknown position';
    $count++;
    return $return;
}, $body);

演示:https://3v4l.org/Ktaod

这将找到每个 {{}} 配对,并根据在字符串中的位置将值替换为数组中的值。

正则表达式 \{{2}(.*?)\}{2} 只是在寻找 2 个 {s,介于两者之间,然后是 2 个 }s。

【讨论】:

  • 仅供参考 preg_replace_callback 有一个可选的第四个参数,称为 $count,它可以避免使用外部计数器。
【解决方案2】:
$body = "This question is a {{x}} of {{y}} within SO.";

$text = ['possible duplicate', '@21100035'];

echo preg_replace_callback('~{{[^{}]++}}~', function($m) use ($text, &$count) {
    return $text[(int)$count++] ?? $m[0];
}, $body, -1, $count);

// Output
// This question is a possible duplicate of @21100035 from SO.

Live demo

【讨论】:

  • 但我事先不知道x和y
  • @Julien :那么你将如何用 {{}} 之间的字符串替换?如果你don't know in advance x and y
  • 用这样的东西:array[0]="value to replace the first {{ }}"; (0替换文字的名字替换那个我不知道,但我知道他的位置
  • @revo 您发送的代码中有错误,您是否成功修复了它(在您的现场演示中)?
  • "解析错误:语法错误,意外'?'在第 6 行的 /in/Hhh8v 中“@revo(我试图删除双 ??,然后发生另一个错误)
【解决方案3】:
<?php

$body = "This question is a {{x}} of {{y}} within SO.";

$searches = ['{{x}}', '{{y}}'];
$replaces = ['possible duplicate', '@21100035'];

echo str_replace($searches, $replaces, $body);

// Output
// This question is a possible duplicate of @21100035 from SO.

编辑: 如果你不知道 X & Y 那么你可以试试这个

<?php

$body = "This question is a {{x}} of {{y}} within SO.";

preg_match_all('/\{\{(.*?)\}\}/', $body, $matches);

$searches = $matches[0];
$replaces = ['possible duplicate', '@21100035'];

echo str_replace($searches, $replaces, $body);

// Output
// This question is a possible duplicate of @21100035 from SO.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2016-02-03
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多