用一个单独的php替换多个连接实例

时间:2017-03-31 05:44:59

标签: php regex preg-replace

我正在剥离HTML并将所有<div><p>代码替换为<br />代码。问题是我留下了随机<br />标签,如

<br /><br /><br />
<br /><br />
<br /><br /><br /><br />

我正在接收电子邮件正文并剥离

等标签
$comment = strip_tags($comment,'<div><p>');
$comment = preg_replace("/<p[^>]*?>/", "", $comment);
$comment = str_replace("</p>", "<br />", $comment);
$comment = preg_replace("/<div[^>]*?>/", "", $comment);
$comment = str_replace("</div>", "<br />", $comment);

我希望能够使用一个<br />标记替换彼此相邻的至少2个<br />标记的任何实例。此时,每个<br />都会与我显示的完全匹配,但是......有可能它们会像<br><br />那样变化,所以只需要确保我能够将任何类型的br标签(当它们中至少有2个)替换为一个单独的标签时,它们会相继重复。

看起来像<br>的br标签的“可能性”是基于它是否已经在我没有捕获的原始HTML中。我知道我可以做str_replace("<br>", "<br />", $comment),但我希望缩短我的代码而不添加更多行。

知道怎么做吗?我确定有正则表达式和preg_replace,但不知道从哪里开始。

1 个答案:

答案 0 :(得分:1)

当您运行$comment = strip_tags($comment, '<div><p>')时,会有 <br>,因为它不是允许的标记。因此,唯一的<br />将来自您的四个替代品。您只需关心表格&#34; <br />&#34;换句话说。但是处理只是 <br />与所有其他<br>形式的难度并不相同。

无论如何,你可以使用:

$comment = preg_replace('/(\s*<br[^>]*>){2,}/', '\1', $comment);
  • <br[^>]*> - 匹配任何类型的<br>代码
  • \s*<br[^>]*> - 在<br>代码
  • 之前匹配零个或多个空格
  • (\s*<br[^>]*>) - 将此正则表达式分组并捕获到\1
  • (…){2,} - 匹配两个或更多此类群组。

替换将保持找到 last <br>