Php 匹配并替换字符串中的占位符
我正在开发一个小型CMS,它接受一个开发者Php 匹配并替换字符串中的占位符,php,arrays,regex,Php,Arrays,Regex,我正在开发一个小型CMS,它接受一个开发者stdClass对象并相应地处理它。stdClass包含数组和其他对象。其中一个对象是变量对象。可能有很多变量和对象 我将只是解释这一点,而不是显示代码,以减少混淆。开发人员指定一个变量和一组可能进入该变量的值。用户指定的值可能是多维数组。这是如何创建variables对象的示例: //Add variable1 $variable = $variables[] = new stdClass; $variable->name = 'var1'; $
stdClass
对象并相应地处理它。stdClass
包含数组和其他对象。其中一个对象是变量对象。可能有很多变量和对象
我将只是解释这一点,而不是显示代码,以减少混淆。开发人员指定一个变量和一组可能进入该变量的值。用户指定的值可能是多维数组。这是如何创建variables对象的示例:
//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_占位符)
$variables[0]
,我正试图扩展它以匹配变体,例如:$variables[0][1]
或$variables[0][2][0]
,等等
一旦我将占位符放入一个数组,将变量值放入另一个数组。我可以执行foreach
循环并替换所有占位符
如有任何建议,将不胜感激。我应该使用什么正则表达式模式来匹配此
$variables[0][2][0]
..您的preg\u match\u all
函数将类似于:
preg_match_all('/\$variables((\[[0-9a-zA-Z]+\])*)/', $text, $matched_placeholders);
这将匹配:
$variables
$variables[#]
$variables[#][#]
- 等等
[#][#][#][#]…
部分存储在$matched_占位符[1]
使用$text='$variables[0][1]或$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] )
)
例如,如果您想重命名您的变量(因为我不知道您实际上在做什么,只是在帮助您处理regex部分),您可以执行以下操作:
$text = preg_replace('/\$variables((\[[0-9a-zA-Z]+\])*)/', '\$newvar$1', $text);
将所有出现的$variables
替换为$newvar
这将起作用:-
str.replaceAll(,)
嗨,谢谢你的意见。你真的帮了大忙。问题解决了!