替换单个变量有效,我如何替换标签的每一次出现?
Replacing a single varible works, how do I replace every occurance of a tag?
所以我为我公司正在开发的项目制作了一个基本的模板系统。目前我能够加载一个模板并将其打印出来,并使用我们开发的标签通过在主模板中调用 <template::>template_name<::/template>
来调用另一个模板中的模板。只要我只调用一个模板,这就很棒。在第一次出现模板标签后,系统停止并且不会继续从数据库中读取字符串的其余部分以获取可能的其他模板标签。
如果我在脚本中多次调用 SAME 模板,它会正确呈现,但如果我调用新模板,它会被系统忽略并打印为普通文本。
这是我当前用于调用标签和替换它们的函数:
$inject_template = $this->get_template_name_between($template, "<template::>", "<::/template>");
if(!empty($inject_template)) {
$query_for_template = "SELECT * FROM ".$field." WHERE templateid = '".$inject_template."' LIMIT 1";
$injected_template_data = $wms->function->query($query_for_template);
while($returned = mysql_fetch_array($injected_template_data)) {
$type = $returned['templatetype'];
}
$template = str_replace('<template::>'.$inject_template.'<::/template>', $this->injectTemplate($inject_template, $type), $template);
}
public function injectTemplate($template_id, $template_number_type) {
return $this->extract_template($template_id, $template_number_type);
}
public function get_template_name_between($string, $start, $end) {
$ini = strpos($string, $start);
if($ini == 0) return '';
$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;
return substr($string, $ini, $len);
}
请记住,如果我调用一个标签,这会起作用,我只需要一种方法来强制函数用每个标签的正确模板替换所有标签。我在想也许是一个 for 循环,并在计数,但不确定这样做的正确语法,我现在整天都在盯着它看,哈哈。提前致谢!
您可以使用不断替换的循环,直到字符串中没有模板。
while ($inject_template = $this->get_template_name_between($template, "<template::>", "<::/template>")) {
$query_for_template = "SELECT * FROM ".$field." WHERE templateid = '".$inject_template."' LIMIT 1";
$injected_template_data = $wms->function->query($query_for_template);
$returned = mysql_fetch_array($injected_template_data);
$type = $returned ? $returned['templatetype'] : '';
$template = str_replace('<template::>'.$inject_template.'<::/template>', $this->injectTemplate($inject_template, $type), $template);
}
您不需要在 mysql_fetch_array()
周围使用 while()
循环,因为查询仅限于 1 行。
顺便说一句,您应该停止使用 mysql_*
函数。转换为 mysqli
或 PDO
,并使用准备好的查询。
所以我为我公司正在开发的项目制作了一个基本的模板系统。目前我能够加载一个模板并将其打印出来,并使用我们开发的标签通过在主模板中调用 <template::>template_name<::/template>
来调用另一个模板中的模板。只要我只调用一个模板,这就很棒。在第一次出现模板标签后,系统停止并且不会继续从数据库中读取字符串的其余部分以获取可能的其他模板标签。
如果我在脚本中多次调用 SAME 模板,它会正确呈现,但如果我调用新模板,它会被系统忽略并打印为普通文本。
这是我当前用于调用标签和替换它们的函数:
$inject_template = $this->get_template_name_between($template, "<template::>", "<::/template>");
if(!empty($inject_template)) {
$query_for_template = "SELECT * FROM ".$field." WHERE templateid = '".$inject_template."' LIMIT 1";
$injected_template_data = $wms->function->query($query_for_template);
while($returned = mysql_fetch_array($injected_template_data)) {
$type = $returned['templatetype'];
}
$template = str_replace('<template::>'.$inject_template.'<::/template>', $this->injectTemplate($inject_template, $type), $template);
}
public function injectTemplate($template_id, $template_number_type) {
return $this->extract_template($template_id, $template_number_type);
}
public function get_template_name_between($string, $start, $end) {
$ini = strpos($string, $start);
if($ini == 0) return '';
$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;
return substr($string, $ini, $len);
}
请记住,如果我调用一个标签,这会起作用,我只需要一种方法来强制函数用每个标签的正确模板替换所有标签。我在想也许是一个 for 循环,并在计数,但不确定这样做的正确语法,我现在整天都在盯着它看,哈哈。提前致谢!
您可以使用不断替换的循环,直到字符串中没有模板。
while ($inject_template = $this->get_template_name_between($template, "<template::>", "<::/template>")) {
$query_for_template = "SELECT * FROM ".$field." WHERE templateid = '".$inject_template."' LIMIT 1";
$injected_template_data = $wms->function->query($query_for_template);
$returned = mysql_fetch_array($injected_template_data);
$type = $returned ? $returned['templatetype'] : '';
$template = str_replace('<template::>'.$inject_template.'<::/template>', $this->injectTemplate($inject_template, $type), $template);
}
您不需要在 mysql_fetch_array()
周围使用 while()
循环,因为查询仅限于 1 行。
顺便说一句,您应该停止使用 mysql_*
函数。转换为 mysqli
或 PDO
,并使用准备好的查询。