0

我面临从 html 代码调用 PHP 函数并填充函数参数的问题。之后,HTML 代码与函数的返回值一起输出。

例如:

在 PHP 文件的某处定义了函数

function html_field($type,$name,$value){ 
//some code here
return $out;
}
// or other example function
function boldme($text){
return "<b>$text</b>";
}

之后在字符串中生成 html 输出,其中包含 php 函数(如标签)

HTML 字符串:

$html = "<h1><label for="foo">{call~html_field("text","name","value")} </label><input type="text" name="foo" id="foo" /> </h1>"

或者

$html = "<h1><label for="foo">{call~boldme("text")} </label><input type="text" name="foo" id="foo" /> </h1>"

解决方案应该结束,例如:

$html = "<h1><label for="foo"><input type="text" name="name" ...> </label><input type="text" name="foo" id="foo" /> </h1>"

或者

$html = "<h1><label for="foo"><b>text</b> </label><input type="text" name="foo" id="foo" /> </h1>"

需要过滤此字符串...

注意:包含从模板和主题中收集的 html 数据的字符串,它们是不可知的文件,其中包含纯 HTML

preg_replace_callback用来创建所需的功能,但现在都消失了,感谢我的老板......!@#!

4

2 回答 2

1

弦乐$html从何而来?如果是静态代码,请使用标准 php:

$html = '<h1><label for="foo">' . html_field("text","name","value") . '</label><input type="text" name="foo" id="foo" /> </h1>';

如果它们是从数据库或文件或其他任何内容加载的,您必须选择:

  • 制作自己的模板引擎,工作量大,bug少,浪费时间
  • 使用像twig这样的轻量级模板引擎,并将你的函数定义为过滤器
于 2013-04-24T12:03:49.587 回答
1

如果你需要解析一个字符串并基于它调用一些函数,你可以使用该preg_replace_callback函数。

这样的事情应该可以解决问题:

$html = "<p>{functionName('value1', 'value2')}</p>";

function contentParser($matches)
{   
    $function = $matches[1];
    $parameters = array_slice($matches, 2);

    return call_user_func_array($function, $parameters);
}

function functionName($valueA, $valueB)
{
    return "You called functionName with values " . $valueA . " and " . $valueB;
}

echo preg_replace_callback(
    "/\{(\w+)\([\"']([^\"']+)[\"'](?:, ?[\"']([^\"']+)[\"'])?\)\}/",
    "contentParser",
    $html);

这将打印以下内容:

You called functionName with values value1 and value2

请注意,我的正则表达式有一个大问题。
您可以将值(在您的 html 中)括在单引号或双引号(“ 或 ' )中,并且可以混合使用它们......这会导致第二个问题,您不能在值中使用它(我不t 检查转义序列)。

仅使用一个字符作为值包装器(当然,您可以更改该字符)的更简单的模式如下:

"/\{(\w+)\(#([^#]+)#(?:, ?#([^#]+)#)?\)\}/"

在这里,我使用尖锐 (#) 作为值分隔符,那么,您的 html 必须如下所示:

<p>{functionName(#value1#, #value2#)}</p>
于 2013-04-24T12:13:41.773 回答