【问题标题】:Match and replace placeholders in a string匹配和替换字符串中的占位符
【发布时间】:2014-12-10 15:45:08
【问题描述】:

我正在开发一个小型 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]...

【问题讨论】:

    标签: php arrays regex


    【解决方案1】:

    您的 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

    【讨论】:

    • 您好,感谢您的意见。你真的帮了大忙。问题解决了!
    【解决方案2】:

    这将起作用:-

    str.replaceAll( , );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2016-08-27
      • 1970-01-01
      • 2014-08-14
      • 2021-09-26
      相关资源
      最近更新 更多