【问题标题】:php, replace text with function callphp,用函数调用替换文本
【发布时间】:2011-04-11 09:01:48
【问题描述】:

在我定制的 cms 中,我需要替换从数据库表中选择的部分文本,其中包含:

Lorem ipsum dolor sit amet, consectetur adipisicing 精英 {块}'myfunc',数组(11, 'thumbnail', 'large', 18){/Block} sed 做eiusmod tempor incidudut ut labore et dolore magna aliqua

带有{Block}的部分文本,应替换为执行myfunc函数的php函数,并传递包含上述数组的参数。

对我来说最大的问题是我不知道文本中有多少个 {Block},以及它们将放置在哪里。

我知道我可以简单地“爆炸”文本,并做一些体操,但我不知道这是否是最好的方法。

我知道这并不简单......如果你能帮我解决这个问题,请。

提前谢谢你!

【问题讨论】:

  • 您应该使用 preg_replace(),您可以传递一个修饰符,使其搜索所有 '{block}{/block}' 字符串。
  • @user198003 & @Gerben Jacobs:不要使用 preg_replace。对于这种应用程序来说完全没有意义。任何类型的字符串替换都不利于像这样的复杂字符串解析。如果块是作为参数的文本的一部分等,它将失败。如果您使用这种模板构建 CMS 系统,您需要像真正的语言一样解析每个模板。看看modx之类的。这将提供一些起点。

标签: php regex preg-replace


【解决方案1】:

我知道,当我想用​​正则表达式做所有事情时,每个人都讨厌我,但我喜欢它:)

$text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit {Block}'myfunc', array(11,'thumbnail','large',18){/Block} sed do eiusmod tempor incididunt ut labore et dolore magna {Block}'myfunc', array(453,'thumbnai23l','small',6458){/Block} aliqua";
function myfunc($data) {
    return '<'.$data[0].'-'.$data[1].'-'.$data[2].'-'.$data[3].'>';
}
preg_match_all("/{Block}'([^,]*)', array\(([^\)]*)\){\/Block}/i", $text, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    $text = str_replace($match[0],$match[1](explode(",", $match[2])), $text);
}
echo $text;

只是,请务必使用相同的分隔符分隔数组值,在我的情况下它只是逗号,在你的情况下,它是逗号 + 空格。随心所欲地调音。

这样的东西很容易被利用,所以,一定要检查 $match[1] 是否在你的允许函数列表中;)

【讨论】:

    【解决方案2】:

    你可以试试这个

    str_replace('{block}',' str_replace('{/block}','?>');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 2014-08-13
      • 2012-05-03
      • 2017-11-03
      • 1970-01-01
      • 2012-11-16
      • 2010-11-09
      相关资源
      最近更新 更多