在PHP中仅用一个空格删除所有<p>

时间:2018-11-03 18:58:52

标签: php html regex preg-replace str-replace

我的代码有问题,例如:

<p>Some text here</p>
<p>More text here</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Some text</p>

我想删除所有<p>&nbsp;</p>。 它显示为<p> </p>,内部带有空格,但是当我复制HTML时,它显示为&nbsp;

我尝试了str_replace('<p> </p> ', '', $data);无效。

我也尝试过preg_replace('#<p>.*?</\1>#s', '', $data);并删除了所有<p>(应该这样做),但是我无法实现只删除带有空格(或{{ 1}}?)里面。 用<p>替换&nbsp;也不起作用。

我确切的PHP代码是:

.*?

我在“查看页面来源”中得到的信息:

/\s+

编辑:两个$recuperer_trajet_infotrafic_1 = explode('<article class="trajet">', $donnees_infotrafic); $recuperer_trajet_infotrafic_2 = explode('</article>' , $recuperer_trajet_infotrafic_1[1] ); $recuperer_trajet_infotrafic_3 = preg_replace('#<p>[0-9 /]+/[0-9 /]+</p>#', '', $recuperer_trajet_infotrafic_2[0]); $trajet_infotrafic = str_replace("/\s?<p>(\s|&nbsp;)*<\/p>/","",$recuperer_trajet_infotrafic_3); echo '<!-- without str_replace1 -->'; echo $recuperer_trajet_infotrafic_3; echo '<!-- without str_replace2 -->'; echo '<!-- with str_replace1 -->'; echo $trajet_infotrafic; echo '<!-- with str_replace2 -->'; 标记之间的字符似乎既不是空格也不是<!-- without str_replace1 --> <!-- TRAJET --> <h3>Votre trajet</h2> <div class="septraf"> </div> <p><span style="text-decoration: underline;">Dans les 2 sens</span> :<br />- arrêt Mimosas reporté à l'arrêt provisoire placé route de Vannes au niveau de la station essence<br />- arrêt Cravate reporté à l'arrêt Ferrière</p> <p> </p> <!-- without str_replace2 --> <!-- with str_replace1 --> <!-- TRAJET --> <h3>Votre trajet</h2> <div class="septraf"> </div> <p><span style="text-decoration: underline;">Dans les 2 sens</span> :<br />- arrêt Mimosas reporté à l'arrêt provisoire placé route de Vannes au niveau de la station essence<br />- arrêt Cravate reporté à l'arrêt Ferrière</p> <p> </p> <!-- with str_replace2 -->,因为我不能仅使用<p>或{{1}来替换它}

5 个答案:

答案 0 :(得分:0)

我不确定是否理解您正确。但是,您可以这样做:

$data = [
        "<p>Some text here</p>",
        "<p>More text here</p>",
        "<p>&nbsp;</p>",
        "<p>&nbsp;</p>",
        "<p>Some text</p>"
];

foreach($data as $key => $para) {
    if($para == "<p>&nbsp;</p>") {
        $data[$key] = ""; // new value here or just unset($data[$key]);
    }
}

答案 1 :(得分:0)

好尝试一下,让我知道

  $new_str = str_replace("<p>&nbsp;</p>", '', $str);

答案 2 :(得分:0)

您需要使用显示的实际文本,而不是在html浏览器上显示的文本,并且实际文本为&nbsp;。而不是空间。试试这个php代码,

$str = "<p>Some text here</p>\n<p>More text here</p>\n<p>&nbsp;</p>\n<p>&nbsp;</p>\n<p>Some text</p>";
echo "Before:\n";
echo $str;
$str = str_replace('<p>&nbsp;</p>', '', $str);
echo "\n\nAfter:\n";
echo $str;

答案 3 :(得分:0)

对于正则表达式替代方案,它将在您可以使用的数据中查找空格或不间断的html实体的不同组合。

示例https://3v4l.org/treZm

preg_replace('/\s?<p>(\s|&nbsp;)*<\/p>/', '', $data);

扩展匹配含义

  

\s?可选地以单个空格字符开头。跟着   通过<p>(\s|&nbsp;)*</p>包含零的段落元素   或更多空白字符或不间断的html实体。

结果

<!-- TRAJET -->
    <h3>Votre trajet</h2>
    <div class="septraf"> </div>
    <p><span style="text-decoration: underline;">Dans les 2 sens</span> :<br />- arrêt Mimosas reporté à l'arrêt provisoire placé route de Vannes au niveau de la station essence<br />- arrêt Cravate reporté à l'arrêt Ferrière</p>

这将删除以下组合:

<p></p>
<p> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;</p>
<p>&nbsp; &nbsp;</p>
<p>&nbsp; </p>
<p> &nbsp;</p>
<p> &nbsp; </p>
\s<p></p>
\s<p> </p>
\s<p>&nbsp;</p>
\s<p>&nbsp;&nbsp;</p>
\s<p>&nbsp; &nbsp;</p>
\s<p>&nbsp; </p>
\s<p> &nbsp;</p>
\s<p> &nbsp; </p>
  

请紧记\s不是字面空间,而是适用于所有   空格字符\n\r\t也是如此。

     

如果您只想匹配水平空间,请将\s替换为\h

     

如果您只想匹配文字空间,请将\s替换为\040[ ]


我相信str_replace的最初问题是由于末尾的空格错误,该错误可能在数据中不存在。

str_replace('<p> </p> ', '', $data);

应该为https://3v4l.org/ptJeE

str_replace('<p> </p>', '', $data);

已更新https://3v4l.org/huv0m

我认为该问题与不符合\xc2\xa0的字面不间断空格alt+0160 \s有关。

preg_replace('/\s?<p>(\s|\xc2\xa0|&nbsp;)*<\/p>/', '', $data);

答案 4 :(得分:0)

如果您无法真正确定<p>...</p>中包含什么字符,则可以使用正则表达式删除包含两个或更少字符的所有<p>元素。
例如,您可以使用preg_replace('/<p>.{0,2}<\/p>/', '' , $data);