1

听起来很简单,但我今天感觉很愚蠢。

如果我有这样的数组:

$defined_vars = array(
    '{POST_TITLE}' => $item['post']['name'], 
    '{POST_LINK}' => $item['post']['link'], 
    '{TOPIC_TITLE}' => $item['topic']['name'], 
    '{TOPIC_LINK}' => $item['topic']['link'], 
    '{MEMBERNAME}' => $txt['by'] . ' <strong>' . $item['membername'] . '</strong>', 
    '{POST_TIME}' => $item['time'], 
    '{VIEWS}' => $txt['attach_viewed'] . ' ' . $item['file']['downloads'] . ' ' . $txt['attach_times'],
    '{FILENAME}' => $item['file']['name'],
    '{FILENAME_LINK}' => '<a href="' . $item['file']['href'] . '">' . $item['file']['name'] . '</a>',
    '{FILESIZE}' => $item['file']['size'],
    '{DIMENSIONS}' => $item['file']['image']['width'] 'x' $item['file']['image']['height'],
);

和这样的字符串:

$string = '<div class="largetext centertext">{POST_LINK}</div><div class="smalltext centertext">{MEMBERNAME}</div><div class="floatright smalltext dp_paddingright">{POST_TIME}</div><div class="dp_paddingleft smalltext">{VIEWS}</div>';

我需要用这些键的值替换它。那有可能吗?也许以str_replace()某种方式使用?数组键是否允许在其中包含大括号?这会引起任何问题吗?此外,我需要这个来替换所有找到这些的 $string 值,因为可能需要超过 1 次相同的输出。例如,如果{POST_TITLE}定义了两次,它应该在字符串中使用它的位置输出两次值。

谢谢

4

4 回答 4

4

str_replace支持数组。以下语法将做到这一点。

$string=str_replace(array_keys($defined_vars), array_values($defined_vars), $string);

数组键中支持大括号,因为它在字符串中,并且字符串作为数组支持。

于 2012-04-27T05:31:54.700 回答
3
foreach($defined_vars as $key=>$value) {
  $string = str_replace($key,$value,$string);
}

这是使用 str_replace 就像你问的那样,很容易看到发生了什么。Php 也有strtr或 string translate 函数来做这个,所以你也可以使用

$string = strtr($string,$defined_vars);

但必须记住该功能的作用。

于 2012-04-27T05:25:17.060 回答
0
<div class="largetext centertext">
  <a href="<?=$item['post']['link']?>"><?=$item['post']['title']?></a>
</div>
<div class="smalltext centertext">
  <?=$txt['by']?><strong><?$item['membername']?></strong>
</div>
<div class="floatright smalltext dp_paddingright"><?$item['time']?></div>
<div class="dp_paddingleft smalltext">
  <?=$txt['attach_viewed']?>
  <?=$item['file']['downloads']?>
  <?=$txt['attach_times']?>
</div>

好吧,如果它是用户定义的字符串,则必须替换

$string = strtr($string,$defined_vars);

另外,我希望您过滤掉用户编辑的 HTML,以防止他们窃取您的 cookie 并以管理员或任何其他用户身份登录。

于 2012-04-27T05:23:02.663 回答
0

是的,你的 str_replace 是合适的,只是 foreach() 循环你的数组

if(isset($defined_vars) and is_array($defined_vars))
{
  foreach($defined_vars as $token => $replacement)
  {
    $string = str_replace($token,$replacement,$string);
  }
}

您可能希望对变量应用一些过滤器,以确保您的 HTML 不会被破坏。

于 2012-04-27T05:24:45.983 回答