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.
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);
Utilisation html_entity_decode
pour convertir des entités HTML.
Vous devrez définir charset pour le faire fonctionner correctement.
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:
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 "walk" the <b>dog</b> now
echo $b; // I'll "walk" the <b>dog</b> now
Cela pourrait bien fonctionner pour supprimer les caractères spéciaux.
$modifiedString = preg_replace("/[^a-zA-Z0-9_.-\s]/", "", $content);
Ce que j'ai fait était d'utiliser: html_entity_decode
, puis utilisez strip_tags
pour les faire enlever.
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");
?>
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;
}
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.
<?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
?>
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
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(' ', ' ', $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 ( ) a test</p>
<div>Yes this is! & 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 '
htmlspecialchars_decode convertit des choses comme &
html_entity_decode convertit des choses comme '<
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.
Vous pouvez essayer htmlspecialchars_decode($string)
. Il fonctionne pour moi.
Http://www.w3schools.com/php/func_string_htmlspecialchars_decode.asp
$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