preg_replace 正则表达式 HTML [已关闭]

问题描述 投票:0回答:2

我在 WordPress 中使用短代码。在每个短代码输出(关闭 div)之后,我得到
(或
)标签。 试图过滤掉它们,但我不知道如何。生成的 HTML 看起来像

<div class="fullwidth"><!-- 1st shortcode-->
<div class="fullwidth-content">
  <!-- 2nd shortcode-->
  <div class="twocol-one"> content
  </div><br>
</div><br>
<!-- 3rd shortcode-->
<div class="twocol-second"> content
</div><br>
<div class="clearboth"></div>
</div><br>

似乎 BR 是来自 tinyMCE 的换行符。我不想要冗长的射击代码行。

我正在尝试使用 preg_replace 但我无法创建正确的 $pattern。

你能帮我吗?

我的功能

function replace_br($content) {
$rep = preg_replace("/<\/div>\s*<br\s*\/?>/i", "</div>",$content);
return $rep; }
add_filter('the_content', 'replace_br');

不工作。

使用时

$rep = preg_replace("/\s*<br\s*\/?>/i", "",$content);
功能上,所有BR都被替换。 很好,但我想在关闭 DIV 标签后仅替换 BR。

str_replace("</div><br>", "</div>", $content);
也不起作用。

我的功能出了什么问题?

没有返回错误。

php regex wordpress tinymce preg-replace
2个回答
0
投票

你一开始就做错了,因为你必须删除标签。 你做错了,因为你正在使用 HTML 的正则表达式(有时这是可以的)。

您使用的正则表达式的变体应该足够了:演示

你真的应该考虑使用

DOMDocument
或类似的:

$html = <<<HTML
...
HTML;

$dom = new DOMDocument();

$dom->loadHTML($html);

$element = $dom->getElementsByTagName('br');

$remove = [];
foreach($element as $item){
  $remove[] = $item;
}

foreach ($remove as $item) {
  $item->parentNode->removeChild($item); 
}

$html = $dom->saveHTML();

echo $html;

这将删除所有

br
,您需要根据您的规格调整代码工作,但这应该是一个指针。


0
投票

这是使用正则表达式的另一种方法
在你的情况下

/(?<=<\/div>)(<br[\s\/]?>)/mg
© www.soinside.com 2019 - 2024. All rights reserved.