donglinxi1467 2015-07-08 21:59
浏览 37
已采纳

如何在<p>标签周围包装div?

I am using Wordpress as a CMS system, and I want to wrap every p tag in some HTML I need for styling and positioning in my website.

I have found a piece of code that does this wonderfully for me, but it is overdoing it right now.

Here it is:

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');

This adds div tags around each p tag. But for every p tag there is in the post, it starts adding more div tags on each p tag. So say I have four p tags, the resulting HTML will be:

<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>

Obviously this not what I need, since I just want each p tag to be wrapped in a single div tag (or whatever my replacement HTML is going to be). Now my PHP skills aren't that great, but I assume the foreach causes it to add div tags for every match it finds in the $matches array? Is there any way to fix this?

</div>
  • 写回答

2条回答 默认 最新

  • duangai9678 2015-07-08 22:11
    关注

    You have several copies of the same <p> tag in your HTML and you are replacing every one of them on each iteration on your foreach loop. Use preg_replace or preg_replace_callback instead of 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');
    

    Note that there is a question mark in the pattern, to make it lazy.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?