为什么输出控制没有捕捉到 sql?

Why output control doesn't catch sql?

我写了一段代码,如果标题不是该类型的第一个标题,它会将标题 h1 更改为 h2。它有效,但仅当我只使用 PHP 时。如果我想在网站上使用它,哪个是使用数据库输出内容,该代码不起作用。

我在 <html> 之前使用 ob_start() 和 ob_get_contents() + ob_end_clean() + 我在 </html> 之后的其余代码,所以我认为从数据库中“捕获”内容一定是错误的,但我不确定。我试图在基于 WordPress 的网站上使用该代码。

我的代码(我知道这可能不是最好的解决方案,但是当我在没有 CMS 的任何网站上使用它时它可以工作):

<!DOCTYPE html>
<?php
    ob_start();
?>
<html>
    <head>
        <title>random page</title>
    </head>
    <body>
      <div class="container">
        <div class="row">
          <div class="col-md-5">
            <h1>afdsfdassfdfdsa</h1>
          </div>
        </div>
      </div>
      <h1>sadffsadf afdsfdsa afsdfs?</h1>
      <h1 class="superclass">random text?</h1>
      <div>
          <p>some ending content</p>
      </div>
    </body>
</html>

<?php
    $bufferContent = ob_get_contents();
    ob_end_clean();

    $matchedContent = '';
    $endContent = '';
    $modifiedContent = '';
    $firstHeadingBoolean = true;
    $h1Pattern = array();
    $h1Pattern[0] = '%<h1(.*?)>%';
    $h1Pattern[1] = '%</h1>%';
    $h1Replacement = array();
    $h1Replacement[0] = '<h2>';
    $h1Replacement[1] = '</h2>';
    if(preg_match_all('%((.|\n)*?)(<h1.*?>.*?</h1>)%', $bufferContent, $contentMatches)){
        foreach($contentMatches[0] as $matches) {
            $matchedContent .= $matches;
        }
        $endContent = str_replace($matchedContent, '', $bufferContent);

        foreach ($contentMatches[0] as $matches) {
            if(!$firstHeadingBoolean){
                $firstHeadingBoolean = false;
            } else {
                $matches = preg_replace($h1Pattern, $h1Replacement, $matches);
            }
            $modifiedContent .= $matches;
        }
        echo $modifiedContent;
        echo $endContent;
    } else {
        echo $bufferContent;
    }
?>

编辑:我尝试使用那里的解决方案但没有任何改变:WordPress filter to modify final html output 现在,经过一些测试,我可以看到它不起作用,因为 preg_match_all 不能正常工作。任何人都知道 preg_match_all 有什么问题吗?我在 regex101 和我的本地主机上测试了该正则表达式模式,一切正常。我不明白,为什么它在这里不起作用?

好的,所以这不是 sql 的问题,而是正则表达式的问题。为了解决这个问题,我使用了这样的代码:

    <?php
ob_start();
?>

<!-- html code -->


    <?php
        
        $bufferContent = ob_get_contents();
        ob_end_clean();
    
        $bufferContent = preg_split("%(?=<h1)%",$bufferContent);
        $i = 0;
        $h1Pattern = array();
        $h1Pattern[0] = '%<h1(.*?)>%';
        $h1Pattern[1] = '%</h1>%';
        $h1Replacement = array();
        $h1Replacement[0] = '<h2>';
        $h1Replacement[1] = '</h2>';
        foreach($bufferContent as $bufferElement){
            if(preg_match("%<h1%", $bufferElement)){
                if($i > 0){
                    echo preg_replace($h1Pattern, $h1Replacement, $bufferElement);
                } else {
                    echo $bufferElement;
                    $i++;
                }
            } else {
                echo $bufferElement;
            }
        }
    ?>