去除标签并用一个空格替换所有 br 和 p 标签

ada*_*m78 0 php regex preg-replace

什么是去除所有的HTML标签和那里有正则表达式<br>和 <p>标签更换一个单一的空间,并删除所有换行符?

例如:

<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p></p>
<p>paragraph1</p>
<p>paragraph2</p>
Run Code Online (Sandbox Code Playgroud)

应该变成:

Heading hyperlink paragraph1 paragraph2
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

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

这给了我:

Heading              hyperlink         paragraph1 paragraph2 
Run Code Online (Sandbox Code Playgroud)

任何实际可行的单行或更优雅的解决方案的想法?

Art*_*nix 7

这就是我会做的:

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


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

输出

 Heading hyperlink paragraph1 paragraph2 
Run Code Online (Sandbox Code Playgroud)

沙盒

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

这很有效,但我可以看到它可能会偏离具体要求的方式。

什么是去除所有 html 标签的正则表达式以及 <br> 和 <p> 标签替换为单个空格并删除所有换行符的地方

所以如果你想要“完整”的解决方案,你可以这样做:

$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);
Run Code Online (Sandbox Code Playgroud)

请注意,我在其中添加了一个<big>标签并删除了<p>标签之间的任何空格。这样做是为了突出一些事情。

例如,如果您从第二个示例中获取文本并在第一个示例中使用它,您将得到这个(因为大标签):

Heading hyperlink p aragraph1 paragraph2 
Run Code Online (Sandbox Code Playgroud)

更新后的示例输出正确。但是,这是一个很大的但是,我更改了输入文本,因此可能没有必要将其过度复杂化。

该<p>标签的事情只是表明它与“”删除所有HTML标记之前使空间在他们之间。

沙盒

更新

@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);
Run Code Online (Sandbox Code Playgroud)

请注意将u标志添加到上面的正则表达式/\s+/u和/^\s+|\s+$/u.

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

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

沙盒