除标签外,替换双换行符

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

我有一些数据库内容作为变量,我想将双线换行变成<p>...</p>

对于单行换行,我想添加<br />

我可以这样做:

$content = nl2br($content, false);
$content = '<p>' . preg_replace('#(<br>[\r\n\s]+){2}#', '</p><p>', $content) . '</p>';

但是,我需要排除有h2,h3,h4,ul并且在ul标签内的段落。但我仍然需要在其他HTML标签周围添加p标签,如<strong> <blockquote> <img> <i> <em><caption>

示例文本将是:

<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit</h2>

Vivamus vel tempor turpis, <strong>non rutrum quam</strong>. Suspendisse ac rhoncus felis, eget porta lectus. 

Nam vulputate sapien risus, vel vehicula mi volutpat sed. 

<ul>
<li>Sed feugiat nibh at nisl eleifend scelerisque.</li>
<li>Aliquam non maximus ipsum. Aliquam erat volutpat.</li>
</ul>

<h3>Praesent eget diam sit amet leo vehicula sagittis at quis tortor</h3>

Nunc nec sem ac nunc tincidunt aliquam ut nec dolor. Nulla facilisi.

<img alt="xxxx" src="xxx.png" class="xxxxx"/> 

<caption><i>ccccc</i></caption> 

<img alt="xxxx" src="xxx.png" class="xxxxx"/> 

<i>ccccc</i>

<strong>Nunc nec sem ac nunc tincidunt aliquam ut nec dolor. Nulla facilisi.</strong>

Vivamus vel tempor turpis, <strong>non rutrum quam</strong>. Suspendisse ac rhoncus felis, eget porta lectus.

Nunc nec
Nunc nec
Nunc nec

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Vivamus vel tempor turpis <a href=""></a></p>&mdash; xxxxx (@xxxxxx) <a href="https://twitter.com/xxxx/status/x?ref_src=x">February 15, 2019</a></blockquote>

<script async src="" charset="utf-8"></script>
php regex-negation
2个回答
0
投票

我建议不要使用nl2br()函数 - 你将在你不想要它们的地方注入<br>标签。

相反,我建议您直接在换行符上执行正则表达式,忽略已经用标记包围的行,如下所示:

(?i)^(?!((<\/|<)(h[1-6]|ul|li|script|blockquote)(\s.+)*>))(.+)(?!(<(\/\3)>))$

如果要排除更多标记,请将它们放在(h[1-6]|ul|li|script|blockquote)组中。

让我们分解一下:

  • (?i)使以下所有匹配不区分大小写
  • ^在线的开头断言位置
  • ?!()分组是一个负面的预测
  • (<\/|<)意味着我们匹配开始或结束标签
  • h[1-6]匹配h1,h2,h3等。
  • (\s.+)*>在开场标签中匹配额外的垃圾,例如<script xyz>
  • (.+)是我们想要包装段落标签的东西
  • \3中的<(\/\3)>与我们匹配的原始标记匹配,用于结束标记

请注意,上面的正则表达式中的(.+)是第5组,这是你想要用<p>标签包围的内容。您可以使用$5中的preg_replace()标记引用第一组,这样您就可以在该组周围包含一个开始和结束的<p>标记。

以下是它的一个例子:https://regex101.com/r/TQGbaq/2

所以你的代码看起来像这样:

$regex = '#(?i)^(?!((<\/|<)(h[1-6]|ul|li|script|blockquote)(\s.+)*>))(.+)(?!(<(\/\3)>))$#';
$content = preg_replace($regex, "<p>$5</p>", $content);

0
投票

您应该在列表中添加<br>,如下所示:

$content = '<p>' . preg_replace('#([\<br\>\r\n\s]{2})#', '</p><p>', $content) . '</p>';
© www.soinside.com 2019 - 2024. All rights reserved.