【问题标题】:PHP: Replace placeholders with dynamic number (delimiters, regex)PHP:用动态数字替换占位符(分隔符、正则表达式)
【发布时间】:2013-04-05 06:39:36
【问题描述】:

尊敬的 stackoverflow 社区,

我目前正在为一个网站制作自己的模板系统,我可以在其中用 php 代码替换 {$stuff} 样式的模板占位符。我有以下代码:

/**
 * Replace a default placeholder.
 *
 * @access    public
 * @param     string $replace     Placeholder name
 * @param     string $replacement Text with which to replace placeholder.
 * @uses      $leftDelimiter
 * @uses      $rightDelimiter
 * @uses      $template
 */
public function assign($replace, $replacement) {
    $this->template = str_replace( $this->leftDelimiter .$replace.$this->rightDelimiter,
                                   $replacement, $this->template );
}

在这种情况下,leftDelimiter 和 rightDelimiter 分别是 {$ 和 }。

现在我想添加一个新函数来动态解析包含数字的占位符 - 例如,{$image_1}、{$image_2}、{$image_3},并让我使用其中包含的数字作为我的替换代码,例如我将 {$image_1337} 替换为 ID 为“1337”的行中的 mysql 数据库条目。

我该怎么做呢?可悲的是,由于我缺乏编码词汇和解释能力,广泛的谷歌搜索和询问朋友让我失望了。它可能与正则表达式有关,但我绝对无法将我的大脑包裹在它们周围,并且所有构建合适表达式的尝试都失败了。

【问题讨论】:

  • preg_replace_callback 可能是开始寻找的好地方。
  • 我认为您最好以稍微不同的方式看待这个问题。你正在做的不是一个简单的模板分配 - 你正在制作一个辅助方法。所以它应该有自己的语法。可能类似于 {image(1337)}。当然,您仍然需要添加新代码来处理这个问题,但我认为从长远来看它会有所回报。

标签: php regex replace delimiter


【解决方案1】:

使用preg_replace 代替str_replace:

preg_replace("/\\{\\\$image_(\d).*?\\}/", "$1", $template)

这个简单的示例将{$image_2} 替换为2 等。

如果您需要在替换中使用真正的逻辑,您有两种选择:

  1. 使用preg_match_all 在模板中查找模式的所有实例。然后,您可以遍历实例,并使用普通的 str_replace($match, $your_smart_replacement, $template)

  2. 使用允许回调函数生成替换的preg_replace_callback。

【讨论】:

  • 编辑:添加了“智能”替换建议。
  • 我不得不使用第一个选项,因为第二个选项对我来说似乎太复杂了......用你的例子和这种方法完美地工作,非常感谢你!但是现在我想分别用变量 $this->leftDelimiter、$replace 和 $this->rightDelimiter 替换示例中的 {$、“图像”和 }。我必须对 reg 表达式进行哪些更改?那些反斜杠正在杀死我......
  • 对它们应用 preg_quote 以转义它们可能包含的所有特殊字符。如果对您有帮助,也请接受答案:)
  • 我想用preg_quote 更新我的答案,但再次阅读您的问题,您对leftDelimiter/replace/rightDelimiter 的设想并不十分清楚。 leftDelimiter 和 rightDelimiter 是否总是 ${ 和 }?只有replace 是可变部分?如果这是正确的,我相信你应该改变你的逻辑,首先找到所有模板模式(leftDelimiter 和rightDelimiter 之间的字符串),然后遍历它们,测试所有可能的模板模式之间的字符串。待续……
  • 2/2:您似乎采取了其他方式,通过迭代您可能的模板模式并尝试在模板中找到它们。但是一旦你的模式有变量,这就行不通了。另请参阅@RobMasters (+1) 的评论。
猜你喜欢
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多