使用PHP preg_match_all在匹配项上运行PHP函数

3

我不确定术语,敬请谅解。

我正在尝试创建一个PHP模板引擎,它将查询一个字符串是否包含<ZONE header></ZONE header>之间的内容,并运行一个PHP函数来查看标题是否存在。如果标题存在,它将显示中间的内容,如果标题不存在,它将删除中间的内容。

这是一个示例:

$string = "
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<ZONE header><img src="images/header.jpg" /></ZONE header>
<p>Nam sollicitudin mattis nisi, eu convallis mi tincidunt vitae.</p>
";

该函数理想情况下应该移除<ZONE header><img src="images/header.jpg" /></ZONE header>,然后运行我创建的php函数header()。该函数会检查数据库中是否存在“header”,如果存在,则会显示<ZONE header></ZONE header>内的所有内容;如果不存在,则会从字符串中删除它。

如果“header”存在:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<img src="images/header.jpg" />
<p>Nam sollicitudin mattis nisi, eu convallis mi tincidunt vitae.</p>

如果"header"不存在:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Nam sollicitudin mattis nisi, eu convallis mi tincidunt vitae.</p>

以下是我正在处理但遇到困难的内容:

以下是我正在处理但遇到困难的内容:

        preg_match_all("|\<ZONE_header>(.*)\<\/ZONE_header>|isU", $string, $zone, PREG_SET_ORDER);

        if (isset($zone) && is_array($zone)) {
            foreach ($zone as $key => $zoneArray) {
                if ($key == 0) { 
                    $html = $zoneArray[1];
                    if ($html != "") {
                        if (header() != "") {
                            $html = str_replace($zoneArray[0], NULL, $html);
                        }
                    }                       
                }
            }
        }

        echo $html;

有什么想法、思路、建议吗? 感谢您的所有帮助!


只是一个提示,在您的输入字符串中,您可能想要使用单引号而不是双引号。请注意,您的<img />标签在src属性中使用双引号。此外,header()是PHP函数,因此您可能需要重命名该函数。 - flowfree
2个回答

0
请注意,我将您的header()函数替换为get_header()函数。
$string = preg_replace_callback('/<ZONE header>(.+)<\/ZONE header>/', 'replace_header', $string);

function replace_header($matches) {
  return get_header() ? $matches[1] : '';
}

请参阅preg_replace_callback的文档。


0

像这样吗?

$string = '
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<ZONE header><img src="images/header.jpg" /></ZONE header>
<p>Nam sollicitudin mattis nisi, eu convallis mi tincidunt vitae.</p>
';
$pattern="#<ZONE header[^>]*>(.+)</ZONE header>#iU"; 

preg_match_all($pattern, $string, $matches);
if (strlen($matches[0][0])==0){
    $string=strip_tags($string,"<p>");
}
else{
    $string=strip_tags($string,"<p><img>");

}
echo $string;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接