我正在使用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标签?有什么方法可以解决这个问题吗?
答案 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不区分大小写。
希望这有帮助。