【问题标题】:How to wrap div around <p> tag?如何将 div 包裹在 <p> 标签周围?
【发布时间】:2015-07-08 21:59:14
【问题描述】:

我使用 Wordpress 作为 CMS 系统,我想将每个 p 标记包装在一些 HTML 中,以便在我的网站中进行样式设置和定位。

我发现一段代码对我来说非常棒,但它现在做得太过分了。

这里是:

function tekst_wrapper($content) {
    // match any p tags
    $pattern = '~<p.*</p>~';
    preg_match_all($pattern, $content, $matches);

    foreach ($matches[0] as $match) {
        // wrap matched p tag with div
        $wrappedframe = '<div>' . $match . '</div>';

        //replace original p tag with new in content
       $content = preg_replace($pattern, $wrappedframe, $content);
    }

    return $content;    
}
add_filter('the_content', 'tekst_wrapper');

这会在每个 p 标签周围添加 div 标签。但是对于帖子中的每个 p 标签,它开始在每个 p 标签上添加更多 div 标签。假设我有四个 p 标签,生成的 HTML 将是:

<div>
  <div>
    <div>
      <div>
        <p>random text</p>
      </div>
    </div>
  </div>
</div>
<div>
  <div>
    <div>
      <div>
        <p>random text</p>
      </div>
    </div>
  </div>
</div>
<div>
  <div>
    <div>
      <div>
        <p>random text</p>
      </div>
    </div>
  </div>
</div>
<div>
  <div>
    <div>
      <div>
        <p>random text</p>
      </div>
    </div>
  </div>
</div>

显然这不是我需要的,因为我只想将每个 p 标签包装在一个 div 标签中(或者我的替换 HTML 将是什么)。现在我的 PHP 技能不是那么好,但我认为 foreach 会导致它为在 $matches 数组中找到的每个匹配项添加 div 标记?有没有办法解决这个问题?

【问题讨论】:

标签: php wordpress


【解决方案1】:

您的 HTML 中有多个相同

标记的副本,并且您在 foreach 循环的每次迭代中都替换了它们中的每一个。使用 preg_replace 或 preg_replace_callback 代替 foreaching。

function tekst_wrapper($content) {
    // match any p tags
    $pattern = '~<p.*?</p>~';
    return preg_replace_callback($pattern, function($matches) {
        return '<div>' . $matches[0] . '</div>';
    }, $content);
}
add_filter('the_content', 'tekst_wrapper');

注意,模式中有一个问号,让它变得懒惰。

【讨论】:

    【解决方案2】:

    这是意料之中的,因为 preg_match_all 匹配所有 4 个 p 标签,然后在 foreach 中,每次循环运行时 preg_replace 都会替换所有 4 个标签,总共循环运行 4 次并且所有标签都被替换4次导致上面的输出。

    要解决这个问题,只需使用 preg_replace 并放弃 preg_match_all,因为 preg_replace 会替换它,所以这就是你最终的结果:

    function tekst_wrapper($content) {
      return preg_replace_callback('~<p.*</p>~i', function($match) {
        return '<div>' . $match[0] . '</div>';
      }, $content);
    }
    
    add_filter('the_content', 'tekst_wrapper');
    

    我已更新正则表达式以在其末尾包含“i”,这使其不区分大小写。这是因为 HTML 不区分大小写。

    希望这会有所帮助。

    【讨论】:

    • 抱歉没有提到,只要把它放到你的函数中就可以了。
    • 您的解决方案也解决了问题,非常感谢!另外,感谢您对〜i的解释,我以前看过很多次,但从未弄清楚它做了什么。在最终的 PHP 中添加了它!
    猜你喜欢
    • 2019-01-28
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2018-09-08
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多