web-dev-qa-db-fra.com

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, qui est effectué par strip_tags. Mais strip_tags ne supprime pas les caractères spéciaux HTML: 

  & © 

etc.

Dites-moi s'il vous plaît n'importe quelle fonction que je peux utiliser pour supprimer ces caractères de code spéciaux de ma chaîne.

52
Prashant

Décodez-les avec html_entity_decode ou supprimez-les avec preg_replace:

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

(De ici )

EDIT: Alternative selon le commentaire de Jacco

pourrait être bien de remplacer le '+' par {2,8} ou quelque chose. Cela limitera la chance de remplacer tout phrases quand un '&' non codé est présent.

$Content = preg_replace("/&#?[a-z0-9]{2,8};/i","",$Content); 
103
schnaader

Utilisez html_entity_decode pour convertir les entités HTML.

Vous aurez besoin de définir charset pour le faire fonctionner correctement.

20
andi

En plus des bonnes réponses ci-dessus, PHP possède également une fonction de filtrage 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. function.filter-var
  2. filter_sanitize_string
16
gpkamp

Vous voudrez peut-être jeter un 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
0xFF

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

$modifiedString = preg_replace("/[^a-zA-Z0-9_.-\s]/", "", $content); 
4
Vinit Kadkol

essaye ça

<?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
RaGu

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

2
Gwapz Juan

Cela ressemble à ce que vous voulez vraiment, c'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
Jacco

La fonction que j’ai utilisée pour accomplir cette tâche, joignant la mise à niveau faite par schnaader, est la suivante:

    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 tous les tags et symboles html convertis au format UTF-8 et prêts à être enregistrés dans MySQL.

1
Lalala
<?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
jahanzaib

Si vous voulez convertir les caractères spéciaux HTML et non pas simplement les supprimer, mais aussi les supprimer et préparer le texte brut, c'est la solution qui m'a fonctionné ...

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 avec ENT_QUOTES | ENT_XML1 convertit des éléments tels que &#39; Htmlspecialchars_decode convertit des éléments tels que &amp; Html_entity_decode convertit des éléments tels que '&lt; Et strip_tags supprime les balises HTML restantes.

EDIT- Ajouté str_replace ('', '', $ str); et plusieurs autres html_entity_decode (), car les tests en cours en ont montré la nécessité.

1
Jay

Un moyen simple de choisir Vanilla pour le faire sans engager le moteur 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
karim79

Vous pouvez essayer htmlspecialchars_decode($string). Ça marche pour moi.

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

0
surabhivin