如何替换包括html标签的整个字符串?

时间:2017-01-10 19:09:28

标签: php html string

我从laravel的文本框中获取以下HTML:

<p>Just a test</p>
<p>&nbsp;</p>
<p>Just a test</p>
<p>&nbsp;</p>
<p>Just a test</p>

基本上我想要做的就是删除所有&nbsp;以及所有<p>&nbsp;</p>,我知道使用正则表达式过滤HTML是一个坏主意,但在我的情况仅限于我上面提到的2个选项。

所以我有以下PHP代码:

$replaceNbsp = array('&nbsp' , '&nbsp;' , '<p>&nbsp;</p>' );
$blog_content = str_replace($replaceNbsp , ' ' , $request->blog_content);
return $blog_content;

但是现在完全删除<p>&nbsp;</p>,我得到以下输出。

<p>Just a test</p>
<p> ;</p>
<p>Just a test</p>
<p> ;</p>
<p>Just a test</p>

如何替换描述中的HTML?

3 个答案:

答案 0 :(得分:3)

在这种情况下,正则表达式没有错:

$blog_content = preg_replace( '/<p>(&nbsp;)?<\/p>/g', '', $request->blog_content );

要坚持原始策略,您需要将数组中的顺序从最具体到最不具体的顺序颠倒过来:

$replaceNbsp = array( '<p>&nbsp;</p>', '&nbsp;' , '&nbsp' );
$blog_content = str_replace($replaceNbsp , ' ' , $request->blog_content);

这样,它会替换首先包含在<p>标记 中的版本,然后替换&nbsp;不包含<p>标记等的版本。

答案 1 :(得分:0)

你可以使用正则表达式来使用这个简单的正则表达式来获取包含非空格和它后面的换行符的段落:

$blog_content = preg_replace('/<p>&nbsp;<\/p>\s*/', '', $request->blog_content);

答案 2 :(得分:0)

你可以尝试这样做:

$replaceNbsp = array( '<p>&nbsp;</p>', '&nbsp;', '&nbsp' );
$blog_content = str_replace($replaceNbsp , ' ' , $request->blog_content);
return $blog_content;