【问题标题】:Multiple <br /><br><br/>\r\n occurences needs to be replaced with <br />多个 <br /><br><br/>\r\n 需要替换为 <br />
【发布时间】:2016-09-14 12:41:25
【问题描述】:

我需要将多次出现的&lt;br /&gt;&lt;br&gt;&lt;br/&gt;\r\n\r\n 替换为仅 1 个&lt;br /&gt;,但仅限于它同时出现的位置,以便我可以将段落拆分成一个数组,并去掉字符串末尾br标签的最后一个换行符...

字符串示例如下:

This is paragraph 1<br>

This is paragraph 2<br /><br>



This is paragraph 3
This is paragraph 4


This is paragraph 5<br/>
This is paragraph 6


This is paragraph 7<br />This is paragraph 8

This is paragraph 9<br>

我尝试过的:

$description = !empty($results['Description']) ? strip_tags(rtrim(str_replace(array("\n", "\r", "\r\n", "<br>", "<br/>", "<br />"), array("<br />"), $results['Description']), '<br />'), '<br><a>') : '';

$paragraphs = array_filter(explode("<br />", $description));

但这会删除所有换行符。我需要在字符串中保留换行符,但只想做 1 个换行符并删除所有其他换行符。如何做到这一点?

注意:我使用的是strip_tags,因为我只想在$description 字符串中允许&lt;br&gt;&lt;a&gt; 标签。

【问题讨论】:

  • This的可能重复
  • 我的不仅仅是br标签,还包括br\r\n
  • 但是为什么我的代码不起作用?
  • 您的代码不起作用,因为您将每次出现的&lt;br /&gt;\n\r\n\r 替换为&lt;br /&gt;。因此,对于test&lt;br /&gt;\n\r\&lt;br /&gt;,您的代码将生成test&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;。 @Virb 向您指出的解决方案正好解决了这个问题。当然,您需要修改该代码以包含 \n\r 等,但它确实解决了您的问题。
  • 先用正则表达式组合&lt;br&gt;,然后在\r\n上使用str_replace

标签: php str-replace paragraphs


【解决方案1】:

您可能想先尝试使用行尾 (PHP_EOL) 爆炸,然后删除除 &lt;a&gt; 之外的所有内容,然后删除 array_filter()implode()trim()

$str    =   'This is paragraph 1<br>

This is paragraph 2<br /><br>



This is paragraph 3
This is paragraph 4


This is paragraph 5<br/>
This is paragraph 6


This is paragraph 7<br />';

$str    =   trim(implode('<br />'.PHP_EOL,array_filter(explode(PHP_EOL,strip_tags($str,'<a>')))));

echo $str;

给你:

This is paragraph 1<br />
This is paragraph 2<br />
This is paragraph 3<br />
This is paragraph 4<br />
This is paragraph 5<br />
This is paragraph 6<br />
This is paragraph 7

您的第二种情况:

$str    =   'This is paragraph 1<br>

This is paragraph 2<br /><br>



This is paragraph 3
This is paragraph 4


This is paragraph 5<br/>This is paragraph 5
This is paragraph 6


This is paragraph 7<br />';

# Explode on line breaks and remove empty lines
$exp    =   array_filter(explode(PHP_EOL,$str));
# Loop array and filter the lines
$new    =   array_map(function($v) {
                return strip_tags(trim($v,'<br>,<br />,<br/>'),'<a><br>');
            },$exp);
# Implode the array back
echo implode('<br />'.PHP_EOL,$new);

给你:

This is paragraph 1<br />
This is paragraph 2<br />
This is paragraph 3<br />
This is paragraph 4<br />
This is paragraph 5<br/>This is paragraph 5<br />
This is paragraph 6<br />
This is paragraph 7

【讨论】:

  • 我更新了问题,可以存在一个br 标记而没有换行符。
  • 非换行符是&lt;br&gt; 之间的问题。那时场景仍然很接近,而不是内爆,只是 foreach 循环并修剪掉 &lt;br&gt;&lt;br /&gt;
  • 这在每个段落之间给了我 2 个&lt;br&gt; 元素。
  • 嗯,我认为将每个段落包装在p 标签中比现在使用br 更好。
  • 我刚刚更新了您的第二个场景。它改用array_map,但想法相同。
猜你喜欢
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 2011-05-21
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多