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

时间:2015-07-08 21:59:15

标签: php wordpress

我正在使用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标签?有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

你有几个相同的副本&lt; p&gt; 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');

请注意,模式中有一个问号,以使其变得懒惰。

答案 1 :(得分:0)

这是预期的,因为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');

我已更新正则表达式以包含&#39; i&#39;在它的最后,这使它不区分大小写。这是因为HTML不区分大小写。

希望这有帮助。