我想在我的网站上有一些宏,例如。 [产品]牛奶[/产品],当它向用户显示我希望它从“牛奶”,图像,产品名称,产品描述中获取一些数据。
修改
我有500多个[产品]条目,所有条目都有图像,产品名称,产品说明。如果我写了一个配方,我希望能够添加牛奶和鸡蛋的图像,使用[产品]鸡蛋[/产品]和[产品]牛奶[/产品],它应该用上面的数据替换。
我想过把它全部放在xml文件或数组中。
答案 0 :(得分:0)
这是一个简单的例子。但是您可以检查BBCODE解析器的现有实现。这可能是有用的例子。
function parse_product($input)
{
if (is_array($input)) {
//here you replace macros with desired content
return '<span calss="my_product">'.$input[1].'</div>';
}
}
return preg_replace_callback($'#\[product](\w+)[/product]#', 'parse_product', $input);
答案 1 :(得分:0)
在C中,宏是预编译器用于优化代码的语法替换 (避免短期任务的不必要的功能跳转)并使其变得容易 为编码员写信。编译器简单地翻译伪代码( 当代码被编译为可执行代码时,实际代码。因为PHP是 没有预编译,我不知道这有什么用。 php源码 代码应该预编译,以获得替换...宏只是没有 有一个运行时编译语言的purpouse,就像在预编译中一样 语言。
当我在使用模块化系统时,每个模块都是一个文件 对象定义。我需要在这个方法中使一些全局变量可访问 每个模块中的对象(即数据库连接对象),但我想要 在整个系统中只有一次这些变量的列表(它会是 如果我决定更改名称,那么编辑所有模块会很不愉快 任何这些变量)。
在这种情况下,函数没用,所以我需要一个宏。
我用这种方式解决了问题:
// In initialisation part of code
define('MY_MACRO', 'global $database, $global_config,
$any_other_needed_variables;');
// In beginning of module object's method
eval (MY_MACRO);
但也许有更好的方法来做到这一点
不同之处在于宏之前被应用为文本替换 进行解析。这意味着宏可以执行 代码上的替换本身不是有效的语言 构造
在C中滥用此类技术的典型例子是
#define BEGIN {
#define END }
then you can do silly things like:
for (i = 0; i < 10; i++)
BEGIN
printf("%d\n", i);
END
明智地使用这些技术可以打开各种各样的技术 可能性。
答案 2 :(得分:0)
如果您需要一个通用的解决方案,它允许您替换[anyTagName] anyContent [/ anyTagName],您可以尝试以下代码:
$regex = '/\\[(\\w+)\\](\\w+)\\[\\/\\1\\]/';
$content = 'A string with some [product]milk[/product] tags';
$parsedContent = preg_replace_callback($regex,function ($matches) {
return process_tags($matches[1],$matches[2]);
},$content);
function process_tags($tagName,$tagContent) {
//What you return from this function will replace the [tagName]tagContent[/tagName] tags.
if ($tagName == 'product') {
//This is a product tag, return something based on $tagContent
}
}