匹配并替换字符串中的占位符

时间:2014-12-10 15:45:08

标签: php arrays regex

我正在开发一个小型CMS,它接受一个开发人员stdClass对象并相应地处理它。 stdClass包含数组和其他对象。其中一个对象是变量对象。可能有很多变量对象。

我将解释这一点,而不是显示代码,以减少混乱。开发人员指定一个变量和一组可以进入该变量的值。用户指定的值可能是多维数组。这是如何创建变量对象的示例:

//Add variable1
$variable = $variables[] = new stdClass;
$variable->name = 'var1'; $variable->generator = 'function'; $variable->value = 'v'; $variable->enum = array (array('Mars', 9.8), array('Earth', 3.77)); $variable->description; $variable->callback = 'callback_function';
//Add variable2
$variable = $variables[] = new stdClass;
$variable->name = 'var1'; $variable->generator = 'function'; $variable->value = 'v'; $variable->enum = array (array('Mars', 9.8), array('Earth', 3.77)); $variable->description; $variable->callback = 'callback_function';

在stdClass中的某个时刻,开发人员必须指定变量的放置位置。占位符模板如下所示:$variables[0]选择第一个变量或$variables[0][1]选择第一个变量,然后选择该变量中的第一个元素。我希望这是有道理的。

我必须提出一个PHP算法,它通过一段文本并用正确的值替换所有占位符。

我的解决方案

  • 将所有变量 - >值转换为新数组。我成功完成了这件事。
  • 将所有占位符放在一段文本中。我被困在这一点上。我不太习惯使用正则表达式。
  • 我开始使用:

    preg_match_all(' / \ $ variables [[0-9a-zA-Z] +] /',$ text,$ matched_placeholders);

..但这只会与$variables[0]匹配,我想扩展它以匹配变体,例如:$variables[0][1]$variables[0][2][0]等。

一旦我将占位符放入数组并将变量值放入另一个数组中。我可以执行foreach循环并替换所有占位符。

任何建议将不胜感激。我应该使用什么正则表达式模式来匹配此$variables[0][2][0] ...

2 个答案:

答案 0 :(得分:0)

您的preg_match_all功能类似于:

preg_match_all('/\$variables((\[[0-9a-zA-Z]+\])*)/', $text, $matched_placeholders);

这将匹配:

  • $variables
  • $variables[#]
  • $variables[#][#]

并将[#][#][#]...部分存储在$matched_placeholders[1]

使用$text = '$variables[0][1] or $variables[0][2][0]';进行测试:

Array (
    [0] => Array ( 
        [0] => $variables[0][1]
        [1] => $variables[0][2][0]
    )
    [1] => Array ( 
        [0] => [0][1]
        [1] => [0][2][0]
    ) // The rest is just "noise"
    [2] => Array ( [0] => [1] [1] => [0] )
)

例如,如果您想重命名变量(因为我不知道您实际上想要做什么,只是帮助您使用正则表达式部分),您可以这样做:

$text = preg_replace('/\$variables((\[[0-9a-zA-Z]+\])*)/', '\$newvar$1', $text);

将用$variables替换$newvar的所有出现。

答案 1 :(得分:-1)

这将有效: -

  
    

str.replaceAll(,);