Как удалить html специальные символы? - PullRequest
52 голосов
/ 18 марта 2009

Я создаю файл RSS-канала для своего приложения, в котором хочу удалить теги HTML, что делается с помощью strip_tags. Но strip_tags не удаляет специальные символы кода HTML:

  & © 

и т.д.

Пожалуйста, скажите мне любую функцию, которую я могу использовать для удаления этих специальных символов кода из моей строки.

Ответы [ 14 ]

104 голосов
/ 18 марта 2009

Или расшифруйте их, используя html_entity_decode, или удалите их, используя preg_replace:

$Content = preg_replace("/&#?[a-z0-9]+;/i","",$Content); 

здесь )

РЕДАКТИРОВАТЬ: Альтернатива в соответствии с комментарием Jacco

может быть неплохо заменить '+' на {2,8} или что-то в этом роде. Это будет ограничивать шанс замены всего предложения, когда незашифрованный '&' нет.

$Content = preg_replace("/&#?[a-z0-9]{2,8};/i","",$Content); 
20 голосов
/ 18 марта 2009

Используйте html_entity_decode для преобразования HTML-объектов.

Вам нужно установить кодировку, чтобы она работала правильно.

16 голосов
/ 16 февраля 2012

В дополнение к хорошим ответам, приведенным выше, в PHP также есть встроенная функция фильтра, которая весьма полезна: filter-var.

Чтобы удалить символы HMTL, используйте:

$cleanString = filter_var($dirtyString, FILTER_SANITIZE_STRING);

Подробнее:

  1. function.filter-вар
  2. filter_sanitize_string
8 голосов
/ 18 марта 2009

Возможно, вы захотите взглянуть на htmlentities () и html_entity_decode () здесь

$orig = "I'll \"walk\" the <b>dog</b> now";

$a = htmlentities($orig);

$b = html_entity_decode($a);

echo $a; // I'll &quot;walk&quot; the &lt;b&gt;dog&lt;/b&gt; now

echo $b; // I'll "walk" the <b>dog</b> now
4 голосов
/ 29 марта 2013

Это может хорошо работать для удаления специальных символов.

$modifiedString = preg_replace("/[^a-zA-Z0-9_.-\s]/", "", $content); 
2 голосов
/ 11 марта 2014

попробуйте

<?php
$str = "\x8F!!!";

// Outputs an empty string
echo htmlentities($str, ENT_QUOTES, "UTF-8");

// Outputs "!!!"
echo htmlentities($str, ENT_QUOTES | ENT_IGNORE, "UTF-8");
?>
2 голосов
/ 16 декабря 2013

Я использовал следующее: html_entity_decode, затем strip_tags, чтобы удалить их.

2 голосов
/ 18 марта 2009

Обычные ванильные струны, способ сделать это без использования движка preg regex:

function remEntities($str) {
  if(substr_count($str, '&') && substr_count($str, ';')) {
    // Find amper
    $amp_pos = strpos($str, '&');
    //Find the ;
    $semi_pos = strpos($str, ';');
    // Only if the ; is after the &
    if($semi_pos > $amp_pos) {
      //is a HTML entity, try to remove
      $tmp = substr($str, 0, $amp_pos);
      $tmp = $tmp. substr($str, $semi_pos + 1, strlen($str));
      $str = $tmp;
      //Has another entity in it?
      if(substr_count($str, '&') && substr_count($str, ';'))
        $str = remEntities($tmp);
    }
  }
  return $str;
}
1 голос
/ 26 января 2018

Если вы хотите преобразовать специальные символы HTML, а не просто удалить их, а также вырезать и подготовить к простому тексту, это было решением, которое мне помогло ...

function htmlToPlainText($str){
    $str = str_replace('&nbsp;', ' ', $str);
    $str = html_entity_decode($str, ENT_QUOTES | ENT_COMPAT , 'UTF-8');
    $str = html_entity_decode($str, ENT_HTML5, 'UTF-8');
    $str = html_entity_decode($str);
    $str = htmlspecialchars_decode($str);
    $str = strip_tags($str);

    return $str;
}

$string = '<p>this is (&nbsp;) a test</p>
<div>Yes this is! &amp; does it get "processed"? </div>'

htmlToPlainText($string);
// "this is ( ) a test. Yes this is! & does it get processed?"`

html_entity_decode w / ENT_QUOTES | ENT_XML1 преобразует такие вещи, как &#39; htmlspecialchars_decode преобразует такие вещи, как &amp; html_entity_decode преобразует такие вещи, как '&lt; и strip_tags удаляет все оставшиеся HTML-теги.

РЕДАКТИРОВАТЬ - Добавлены str_replace ('', '', $ str); и несколько других html_entity_decode (), поскольку продолжение тестирования показало необходимость в них.

1 голос
/ 14 июля 2011

Функция, которую я использовал для выполнения задачи, присоединяясь к обновлению, сделанному schnaader:

    mysql_real_escape_string(
        preg_replace_callback("/&#?[a-z0-9]+;/i", function($m) { 
            return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); 
        }, strip_tags($row['cuerpo'])))

Эта функция удаляет все теги html и символы html, преобразованные в UTF-8, готовые для сохранения в MySQL

...