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)
任何实际可行的单行或更优雅的解决方案的想法?
这就是我会做的:
$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> </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);
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 进行排序,如上所示。
| 归档时间: |
|
| 查看次数: |
1103 次 |
| 最近记录: |