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.
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);
Utilisez html_entity_decode
pour convertir les entités HTML.
Vous aurez besoin de définir charset pour le faire fonctionner correctement.
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:
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 "walk" the <b>dog</b> now
echo $b; // I'll "walk" the <b>dog</b> now
Cela pourrait fonctionner pour supprimer des caractères spéciaux.
$modifiedString = preg_replace("/[^a-zA-Z0-9_.-\s]/", "", $content);
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");
?>
Ce que j'ai fait était d'utiliser: html_entity_decode
, puis utilisez strip_tags
pour les supprimer.
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.
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.
<?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
?>
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(' ', ' ', $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 avec ENT_QUOTES | ENT_XML1 convertit des éléments tels que '
Htmlspecialchars_decode convertit des éléments tels que &
Html_entity_decode convertit des éléments tels que '<
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é.
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;
}
Vous pouvez essayer htmlspecialchars_decode($string)
. Ça marche pour moi.
http://www.w3schools.com/php/func_string_htmlspecialchars_decode.asp