剥离标签并将所有br和p标签替换为一个空格

时间:2018-12-28 16:55:08

标签: php regex preg-replace

剥离所有html标记的正则表达式是什么?<br><p>标记替换为单个空格并删除所有换行符的地方?

例如:

<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p></p>
<p>paragraph1</p>
<p>paragraph2</p>

应成为:

Heading hyperlink paragraph1 paragraph2

我尝试了以下方法:

$string = preg_replace( ["/<br\s*\/?>/i","/<\/p\s*>/i"]," ",$string);
$string = preg_replace(["/<\/?[^>]+>/", "/\r?\n|\r/"],"",$string);

哪个给我:

Heading              hyperlink         paragraph1 paragraph2 

关于单行或更有效的优雅解决方案的任何想法?

6 个答案:

答案 0 :(得分:3)

像对待字符串一样处理HTML并使用正则表达式从来都不是一个好主意。唯一不涉及DOM解析器的体面解决方案将使用PHP的内置strip_tags函数(其中usesstate machine,因此仍然容易受到HTML损坏的潜在问题的影响)然后您可以使用正则表达式来压缩生成的空白:

<?php
$html = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p></p>
<p>paragraph1</p>
<p>paragraph2</p>';

echo preg_replace("/\s+/", " ", strip_tags($html));

输出:

Heading hyperlink paragraph1 paragraph2

答案 1 :(得分:2)

这就是我要做的:

$a = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p></p>
<p>paragraph1</p>
<p>paragraph2</p>';


echo trim(preg_replace(['/<[^>]*>/','/\s+/'],' ', $a));

输出

 Heading hyperlink paragraph1 paragraph2 

Sandbox

第一个正则表达式删除用空格替换它们的标记,第二个则使用多个空格并将其更改为一个。

这很好用,但是我可以看到它可能会偏离具体要求。

  

剥离所有html标记的正则表达式是什么,用

标记替换单个空格并删除所有换行符的正则表达式

因此,如果您需要“完整”的解决方案,则可以执行以下操作:

$a = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p></p>
<p><big>p</big>aragraph1</p><p>paragraph2</p>';

echo preg_replace([
    '/<(?:br|p)[^>]*>/i', //replace br p with ' '
    '/<[^>]*>/',  //replace any tag with ''
    '/\s+/', //remove run on space
    '/^\s+|\s+$/' //trim
],[
    ' ', '', ' ', ''
], $a);

请注意,我在其中添加了<big>标签,并删除了<p>标签之间的所有空格。这样做是为了突出一些内容。

例如,如果您从第二个示例中获取文本并在第一个示例中使用它,则会得到此代码(因为有大标记):

Heading hyperlink p aragraph1 paragraph2 

更新后的示例正确输出。但是,这很大,但是我更改了输入文本,因此可能不必过于复杂。

<p>标记只是表明,在用''删除所有HTML标记之前,它们之间放置了空格。

Sandbox

更新

  

@ArtisticPhoenix我将如何适应<p>&nbsp;</p>

首先,我将使用html_entity_decode转换字符串,但是有一些棘手的地方。这些与编码有关。所以这是正确的方法:

$a = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p>&nbsp;</p>
<p><big>p</big>aragraph1</p><p>paragraph2</p>';

 //convert entities using UTF-8
$a = html_entity_decode($a, ENT_QUOTES, 'UTF-8');

echo preg_replace([
    '/<(?:br|p)[^>]*>/i', //replace br p with ' '
    '/<[^>]*>/',  //replace any tag with ''
    '/\s+/u', //remove run on space - replace using the unicode flag
    '/^\s+|\s+$/u' //trim - replace using the unicode flag
],[
    ' ', '', ' ', ''
], $a);

请注意,u/\s+/u上方的正则表达式中添加了/^\s+|\s+$/u标志。

  

u(PCRE_UTF8)   此修改器打开了与Perl不兼容的PCRE的其他功能。模式和主题字符串被视为UTF-8。无效的主题将导致preg_ *函数不匹配。无效的模式将触发E_WARNING级别的错误。自PHP 5.3.4起(分别为PCRE 7.3 2007-08-28),五个和六个八位字节的UTF-8序列被视为无效;以前那些被认为是有效的UTF-8。

问题来自于将其解码为ASCII 160(nbsp)字符而不是ASCII 32字符(单个空格)。无论如何,我们可以使用UTF-8对其进行排序,如上所示。

Sandbox

答案 2 :(得分:0)

您可以将多个用空格包围的标签分组,并用一个空格替换它们。要替换的正则表达式为

(\s*<[^>]+>\s*)+

这将为您提供一个空格代替所有这些标签,并最终使用trim()来消除您可能不需要的最右边和左边的空格。

Demo

这是演示的php代码,

$html = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p></p>
<p>paragraph1</p>
<p>paragraph2</p>';

echo trim(preg_replace("/(\s*<[^>]+>\s*)+/", " ", $html));

打印

Heading hyperlink paragraph1 paragraph2

答案 3 :(得分:0)

您可以使用此

<\s*\/?\s*br[^>]*>|<\s*\/?\s*p[^>]*>|\n
  

说明

  • <\s*\/?\s*br[^>]*>-将<br></br><br/>与任意数量的空格匹配,并且还匹配属性。
  • <\s*\/?\s*p[^>]*>-将<p></p><p/>与任意数量的空格匹配属性进行匹配。
  • \n-匹配新行。

Demo

答案 4 :(得分:0)

您可以保留多余的空间

$stripped = preg_replace('/\s+/', ' ', $string);

给出: 标题超链接第1段第2段

答案 5 :(得分:0)

方法是使用两种模式

P1 <[\/\d\w]+.*?> 将会清除所有标签。

P2 [\n\s]+并替换为单个空格

示例:

$string = preg_replace( "<[\/\d\w]+.*?>","",$string);
$string = preg_replace("[\n\s]+"," ",$string);