【问题标题】:str_replace returns empty string after replacestr_replace 替换后返回空字符串
【发布时间】:2021-10-20 02:54:54
【问题描述】:

我正在尝试替换我的自定义短代码,但函数 str_replace 返回空。

我有一个固定的搜索列表。

$search = array(15) {
  [0]=>
  string(13) "{{user_name}}"
  [1]=>
  string(17) "{{ticket_number}}"
  [2]=>
  string(15) "{{ticket_link}}"
  [3]=>
  string(18) "{{ticket_subject}}"
  [4]=>
  string(22) "{{ticket_description}}"
}

$replace = array(1) {
  [0]=>
  string(23) "ticket with attachments"
}


$subject = string(20) "{{ticket_subject}}"

echo str_replace($search, $replace, trim($subject));

为什么结果为空?

【问题讨论】:

  • php 文档说:If replace has fewer values than search, then an empty string is used for the rest of replacement values. 两个数组需要相同的大小和顺序。
  • 这是无效的 PHP 代码。如果您想将 $search 中的所有元素替换为相同的字符串,请将 $replace 设为字符串
  • 如果我可以用另一种方式解决我的代码示例?
  • both arrays need the same size and order...应该给你足够的信息来解决它。或者查看已经有替代方法的 brombeer 的答案。

标签: php replace


【解决方案1】:

根据 PHP 文档:

如果 replace 的值比 search 少,则空字符串用于其余的替换值

您的搜索数组的值比替换数组的多。

(https://www.php.net/manual/en/function.str-replace.php)

【讨论】:

  • 伯特·比恩,非常感谢。如果我可以用另一种方式解决我的代码示例?
  • 我并不完全清楚你想要实现什么,但你应该在你的替换数组中放 5 个项目
【解决方案2】:

如果您想将$search 中的所有元素替换为相同的字符串,请将@​​987654322@ 设为字符串。

来自the documentation:“如果 search 是一个数组,而 replace 是一个字符串,那么这个替换字符串将用于 的每个值搜索

<?php
$search = [
    "{{user_name}}",
    "{{ticket_number}}",
    "{{ticket_link}}",
    "{{ticket_subject}}",
    "{{ticket_description}}",
];
$replace = "ticket with attachments";
$subject = "{{ticket_subject}}";
echo str_replace($search, $replace, $subject);

编辑:使用数组的不同方法:

<?php
$replacements = [
    "{{user_name}}" => 'Roman',
    "{{ticket_number}}" => 1234567890,
    "{{ticket_link}}" => 'url.com',
    "{{ticket_subject}}" => 'Hello World',
    "{{ticket_description}}" => 'foo bar',
];

$search = array_keys($replacements);
$replace = array_values($replacements);

$subject = "Dear {{user_name}}, we received your ticket #{{ticket_number}} with subject {{ticket_subject}}({{ticket_description}}). As a reminder, {{user_name}}, please close your ticket #{{ticket_number}}";
echo str_replace($search, $replace, $subject);

将输出:

亲爱的 Roman,我们收到了您的票号 #1234567890,主题为 Hello World(foo bar)。提醒一下,Roman,请关闭您的票#1234567890

【讨论】:

  • brombeer,我有一个动态替换值.. 它可以是一个元素或 10 个元素.. 这取决于主题。
  • 这是您的问题首先应该提到的重要信息。
  • 如果您“有一个固定的搜索列表”,您将如何用 10 个元素替换这 5 个项目?请在您的问题中解释不同的情况可能是什么。
  • brombeer,是的,我有一个固定的搜索列表,但在替换数组元素中可以重复多次。例如,在主题中,我可以有 2 个 ticket_number 和 3 个 ticket_subject .. 它就像具有动态主题但固定搜索的电子邮件模板。
  • 不确定我能不能跟上。我没有意义(对我来说)有 more replacement 元素而不是 search 的元素。确保它们至少大小相同。 $subject 字符串中的多个 {{ticket_subject}} 将替换为来自 $replace 的相同元素
猜你喜欢
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多