Удалить все <p>только с одним пробелом внутри в PHP - PullRequest
0 голосов
/ 03 ноября 2018

У меня проблема с моим кодом, например:

<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> (как и должно быть), но я не могу добиться удаления только <p> с пробелом (или &nbsp;?) Внутри. Замена .*? на /\s+ тоже не работает.

Мой точный код PHP:

$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> не является ни пробелом, ни &nbsp;, потому что я не мог заменить его, используя str_replace('&nbsp;','TEST',$data) или str_replace(' ','TEST',$data);

Ответы [ 5 ]

0 голосов
/ 07 ноября 2018

Если вы не можете определить, какой символ находится внутри вашего <p>...</p>, вы можете использовать регулярное выражение, чтобы удалить все элементы <p>, содержащие 2 или менее символов.
Например, вы можете использовать preg_replace('/<p>.{0,2}<\/p>/', '' , $data);.

0 голосов
/ 04 ноября 2018

Для альтернативы регулярному выражению, которая будет искать различные комбинации пробелов или неразрывных пробелов 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);
0 голосов
/ 03 ноября 2018

Ну, попробуйте и дайте мне знать

  $new_str = str_replace("<p>&nbsp;</p>", '', $str);
0 голосов
/ 03 ноября 2018

Вам нужно использовать настоящий текст вместо того, как он выглядит в 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;
0 голосов
/ 03 ноября 2018

Я не уверен, правильно ли я вас понял. Но вы можете сделать это так:

$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]);
    }
}
...