剥离所有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
关于单行或更有效的优雅解决方案的任何想法?
答案 0 :(得分:3)
像对待字符串一样处理HTML并使用正则表达式从来都不是一个好主意。唯一不涉及DOM解析器的体面解决方案将使用PHP的内置strip_tags
函数(其中uses和state 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
第一个正则表达式删除用空格替换它们的标记,第二个则使用多个空格并将其更改为一个。
这很好用,但是我可以看到它可能会偏离具体要求。
剥离所有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标记之前,它们之间放置了空格。
更新
@ArtisticPhoenix我将如何适应
<p> </p>
首先,我将使用html_entity_decode
转换字符串,但是有一些棘手的地方。这些与编码有关。所以这是正确的方法:
$a = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p> </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对其进行排序,如上所示。
答案 2 :(得分:0)
您可以将多个用空格包围的标签分组,并用一个空格替换它们。要替换的正则表达式为
(\s*<[^>]+>\s*)+
这将为您提供一个空格代替所有这些标签,并最终使用trim()
来消除您可能不需要的最右边和左边的空格。
这是演示的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
-匹配新行。答案 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);