在html中使用php代码。。。在php中

在html中使用php代码。。。在php中,php,Php,假设您有一个存储文章的mysql数据库 html的存储方式如下: <h1>I'm just foo</h1> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p> 我只是个傻瓜 Lorem ipsum dolor sit

假设您有一个存储文章的mysql数据库

html的存储方式如下:

<h1>I'm just foo</h1>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
我只是个傻瓜
Lorem ipsum dolor sit amet,是一位杰出的领导者

Lorem ipsum dolor sit amet,是一位杰出的领导者

并使用mysql_查询显示和运行结果

但这里有一个难点:您可能偶尔需要使用预定义的函数,例如在html中插入一个映射。用户如何在html中输入这些内容?我不能很好地输入:

<?php insertMap() ?>

这将呈现为php标记,其中包含php标记

我见过不同的CMSE以不同的方式处理它。例如,使用{{{insertMap}}}调用函数。但是,我如何运行代码,查找{{{}}并将其作为函数运行


谷歌和我有一种感觉,eval()是解决方案的一部分(尽管存在安全风险?),但任何建议、指针等都是最受欢迎的

有很多模板引擎在做这项工作,您可以不用
eval()
来完成这项工作。使用高级解析类。预定义函数列表等并使用它。或者只使用模板引擎。

基本上,您可以在存储的内容中查找并替换这些占位符(其格式是您可以自由决定的),然后将它们替换为计算从它们派生的表达式的结果。使用
eval
是不必要的(或一个好主意)。为此,您可以非常轻松地滚动自己的类eval代码,该代码只支持
eval
功能的安全子集

假设您选择
{{{xxx}}}
作为占位符模板。要匹配它,最简单的方法是通过同一系列中的函数或其他函数来使用;因为我们也希望替换,并且希望动态生成替换,所以我们将使用

要替换的模式将是
'/{{([a-zA-Z!+)}}}/'
,它匹配一个或多个字母的序列以及花括号之间的下划线。其中的括号是特定于正则表达式的语法,我使用了它们,以便以后可以轻松地引用其中的部分(比如“模板”的名称),而不用担心括号

回调将是一个函数,在给定模式的情况下生成替换内容:

function produce_replacement($match) {
    // $match[1] means "the part of the template inside the braces";
    // read up on the documentation of preg_replace_callback for more.
    $producerName = 'evaluate_'.strtolower($match[1]);
    return function_exists($producerName) ? $producerName() : null;
}
此函数用于获取模板名称(例如
{{xxx}}
中的
xxx
),并查看是否存在名为
evaluate\u xxx
的函数。如果是,则调用函数并返回结果;如果不是,则返回
null
。在任何情况下,结果都将替换原始文本中的模板

重要提示:这是一个为实现提供安全性的设计决策我们这样做是为了用户可以在文本中使用他们想要的任何“模板”,但是这些模板只会导致代码在名为
evaluate\u xxx
或类似函数中执行。由于这些函数的存在与否是由您控制的,因此用户的标记实际上可以做什么受到限制

因此,您现在可以:

$text = "Hello there {{{name}}}!";
$pattern = '/{{{([a-zA-Z_]+)}}}/';

$text = preg_replace_callback($pattern, 'produce_replacement', $text);
echo $text;

function evaluate_name() {
    return "Joe";
}

实际上,您可以用五行代码来完成这项工作。不需要模板引擎,解析类等等。@Jon是的,但我写的答案是通用的,不仅仅是一个函数哇,太棒了!非常感谢,我们将尽快尝试实施:)抱歉再次打扰您:)我或多或少地调整了您的解决方案以满足我的需要。。。将变量传递给我正在运行的函数是一项挑战。。。我唯一想不起来的事情可能很简单:我在同一页上有几个调用,比如{{{showMap}}、{{{{showRating}}、{{{{subItems}}。如果我有三个不同的呼叫,只有第一个会运行,但会显示三次。有什么建议给我指出正确的方向吗?谢谢:)