Comment supprimer les caractères spéciaux html?

Je crée un fichier de flux RSS pour mon application dans lequel je souhaite supprimer les balises HTML, ce qui est fait par strip_tags. Mais strip_tags ne supprime pas les caractères de code HTML Spéciaux:

  & © 

Etc.

Veuillez me dire toute fonction que je peux utiliser pour supprimer ces caractères de code spéciaux de ma chaîne.

52
demandé sur felipe.zkn 2009-03-18 13:09:42

14 réponses

Soit les décoder en utilisant html_entity_decode ou les supprimer en utilisant preg_replace:

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

(à Partir de ici)

EDIT: Alternative selon le commentaire de Jacco

Pourrait être bien de remplacer le ' + ' par {2,8} ou quelque chose. Cela permettra de limiter la chance de remplacer l'ensemble les phrases lors d'un clair '&' est présent.

$Content = preg_replace("/&#?[a-z0-9]{2,8};/i","",$Content); 
102
répondu schnaader 2009-12-14 20:43:59

Utilisation html_entity_decode pour convertir des entités HTML.

Vous devrez définir charset pour le faire fonctionner correctement.

19
répondu andi 2009-03-18 10:30:41

En plus des bonnes réponses ci-dessus, PHP a également une fonction de filtre intégrée qui est très utile: filter-var.

Pour supprimer les caractères HMTL, utilisez:

$cleanString = filter_var($dirtyString, FILTER_SANITIZE_STRING);

Plus d'infos:

  1. fonction.filtre-var
  2. filter_sanitize_string
16
répondu gpkamp 2012-02-17 09:54:41

Vous pouvez prendre un coup d'oeil à htmlentities() et html_entity_decode() ici

$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
8
répondu 0xFF 2009-03-18 10:16:14

Cela pourrait bien fonctionner pour supprimer les caractères spéciaux.

$modifiedString = preg_replace("/[^a-zA-Z0-9_.-\s]/", "", $content); 
4
répondu Vinit Kadkol 2013-08-07 08:14:04

Ce que j'ai fait était d'utiliser: html_entity_decode, puis utilisez strip_tags pour les faire enlever.

2
répondu Gwapz Juan 2013-12-16 15:36:35

Essayez ceci

<?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
répondu RaGu 2014-03-11 04:11:08

Une manière simple de le faire sans engager le moteur regex preg:

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
répondu karim79 2009-03-18 11:19:50

Il semble que ce que vous voulez vraiment est:

function xmlEntities($string) {
    $translationTable = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);

    foreach ($translationTable as $char => $entity) {
        $from[] = $entity;
        $to[] = '&#'.ord($char).';';
    }
    return str_replace($from, $to, $string);
}

Il remplace les entités nommées par leur nombre équivalent.

1
répondu Jacco 2009-03-18 16:21:55
<?php
function strip_only($str, $tags, $stripContent = false) {
    $content = '';
    if(!is_array($tags)) {
        $tags = (strpos($str, '>') !== false
                 ? explode('>', str_replace('<', '', $tags))
                 : array($tags));
        if(end($tags) == '') array_pop($tags);
    }
    foreach($tags as $tag) {
        if ($stripContent)
             $content = '(.+</'.$tag.'[^>]*>|)';
         $str = preg_replace('#</?'.$tag.'[^>]*>'.$content.'#is', '', $str);
    }
    return $str;
}

$str = '<font color="red">red</font> text';
$tags = 'font';
$a = strip_only($str, $tags); // red text
$b = strip_only($str, $tags, true); // text
?> 
1
répondu jahanzaib 2010-07-10 17:33:34

La fonction que j'ai utilisée pour effectuer la tâche, en rejoignant la mise à niveau effectuée par schnaader est:

    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'])))

Cette fonction supprime chaque balise html et symbole html, converti en UTF-8 prêt à enregistrer dans MySQL

1
répondu Lalala 2011-07-14 15:08:37

Si vous voulez convertir les caractères spéciaux HTML et pas seulement les supprimer ainsi que dépouiller les choses et se préparer pour le texte brut, c'était la solution qui a fonctionné pour moi...

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 convertit des choses comme &#39; htmlspecialchars_decode convertit des choses comme &amp; html_entity_decode convertit des choses comme '&lt; et strip_tags supprime toutes les balises HTML restantes.

EDIT - Ajouté str_replace (' ' ,'', $str); et plusieurs autres html_entity_decode () comme la poursuite des tests a montré un besoin pour eux.

1
répondu Jay 2018-05-15 14:33:50

Vous pouvez essayer htmlspecialchars_decode($string). Il fonctionne pour moi.

Http://www.w3schools.com/php/func_string_htmlspecialchars_decode.asp

0
répondu surabhivin 2015-10-01 14:53:44
$string = "äáčé";

$convert = Array(
        'ä'=>'a',
        'Ä'=>'A',
        'á'=>'a',
        'Á'=>'A',
        'à'=>'a',
        'À'=>'A',
        'ã'=>'a',
        'Ã'=>'A',
        'â'=>'a',
        'Â'=>'A',
        'č'=>'c',
        'Č'=>'C',
        'ć'=>'c',
        'Ć'=>'C',
        'ď'=>'d',
        'Ď'=>'D',
        'ě'=>'e',
        'Ě'=>'E',
        'é'=>'e',
        'É'=>'E',
        'ë'=>'e',
    );

$string = strtr($string , $convert );

echo $string; //aace
-1
répondu Zombyii 2015-05-13 11:32:12