如何删除html特殊字符?

时间:2009-03-18 10:09:42

标签: php html-encode

我正在为我的应用程序创建一个RSS提要文件,我要在其中删除由strip_tags完成的HTML标记。但strip_tags并未删除HTML特殊代码字符:

  & © 

请告诉我任何可用于从我的字符串中删除这些特殊代码字符的函数。

15 个答案:

答案 0 :(得分:104)

使用html_entity_decode解码它们或使用preg_replace删除它们:

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

(来自here

编辑:根据Jacco的评论替代

  

可能很好用'。'替换'+'   {2,8}或者别的什么。这将限制   有可能取代整个   一个未编码的'&'的句子是   本。

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

答案 1 :(得分:20)

使用html_entity_decode转换HTML实体。

您需要设置charset才能使其正常工作。

答案 2 :(得分:16)

除了上面的好答案之外,PHP还有一个非常有用的内置过滤器功能:filter-var。

要删除HMTL字符,请使用:

$cleanString = filter_var($dirtyString, FILTER_SANITIZE_STRING);

更多信息:

  1. function.filter-var
  2. filter_sanitize_string

答案 3 :(得分:8)

您可能需要查看htmlentities()和html_entity_decode()here

$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 :(得分:4)

这可能适用于删除特殊字符。

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

答案 5 :(得分:2)

无需使用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;
}

答案 6 :(得分:2)

我所做的就是使用:html_entity_decode,然后使用strip_tags删除它们。

答案 7 :(得分:2)

试试这个

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

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

// Outputs "!!!"
echo htmlentities($str, ENT_QUOTES | ENT_IGNORE, "UTF-8");
?>

答案 8 :(得分:1)

看起来你真正想要的是:

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);
}

它用等号数替换命名实体。

答案 9 :(得分:1)

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

答案 10 :(得分:1)

我用来执行任务的功能,加入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中

答案 11 :(得分:1)

如果您想转换 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()作为持续测试表明需要它们。

答案 12 :(得分:0)

您可以尝试htmlspecialchars_decode($string)。它对我有用。

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

答案 13 :(得分:0)

如果您像我一样使用WordPress,并且只需要检查一个空字段(并且在空白字符串中有大量随机html实体),那么请看一下:

sanitize_title_with_dashes( string $title, string $raw_title = '', string $context = 'display' )

Link to wordpress function page

对于不使用WordPress的人们,我发现此功能对于创建自己的消毒器确实非常有用,请查看完整代码,它的确非常深入!

答案 14 :(得分:-1)

$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