61

我正在为我想要删除 HTML 标记的应用程序创建一个 RSS 提要文件,该文件由strip_tags. 但strip_tags不删除 HTML 特殊代码字符:

  & © 

等等

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

4

16 回答 16

118

使用解码html_entity_decode或删除它们preg_replace

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

(从这里

编辑:根据 Jacco 的评论替代

用 {2,8} 或其他东西替换“+”可能会很好。当存在未编码的“&”时,这将限制替换整个句子的机会。

$Content = preg_replace("/&#?[a-z0-9]{2,8};/i","",$Content); 
于 2009-03-18T10:16:58.460 回答
21

用于html_entity_decode转换 HTML 实体。

您需要设置字符集以使其正常工作。

于 2009-03-18T10:15:19.417 回答
18

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

要删除 HMTL 字符,请使用:

$cleanString = filter_var($dirtyString, FILTER_SANITIZE_STRING);

更多信息:

  1. function.filter-var
  2. filter_sanitize_string
于 2012-02-16T16:59:55.767 回答
8

您可能想在这里查看 htmlentities() 和 html_entity_decode()

$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
于 2009-03-18T10:16:14.187 回答
4

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

$modifiedString = preg_replace("/[^a-zA-Z0-9_.-\s]/", "", $content); 
于 2013-03-29T09:58:05.493 回答
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;
}
于 2009-03-18T11:19:50.883 回答
2

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

于 2013-12-16T15:36:35.443 回答
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");
?>
于 2014-03-11T04:11:08.323 回答
2

如果您想转换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 之类的东西html_entity_decode 之类的东西&amp; 转换之类的东西'&lt; strip_tags 删除任何剩余的 HTML 标签。

编辑- 添加 str_replace(' ', ' ', $str); 和其他几个 html_entity_decode() 继续测试表明需要它们。

于 2018-01-26T00:19:47.187 回答
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);
}

它将命名实体替换为它们的等价物。

于 2009-03-18T16:21:55.197 回答
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
?> 
于 2010-07-10T11:43:18.977 回答
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 中

于 2011-07-14T15:08:37.510 回答
0

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

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

链接到wordpress功能页面

对于不使用 WordPress 的人,我发现这个功能对于创建我自己的消毒剂非常有用,看看完整的代码,它真的很深入!

于 2020-09-29T09:01:30.183 回答
0

如果“删除 HTML 特殊字符”的意思是“适当替换”怎么办?

毕竟,看看你的例子......

&nbsp; &amp; &copy;

如果您将其剥离为 RSS 提要,您不应该想要等价物吗?

" ", &, ©

或者,也许您并不完全想要等价物。 也许您&nbsp;只想被忽略(以防止太多空间),但&copy;实际上已被替换。让我们制定一个解决方案来解决这个问题的任何人的版本......

如何选择性地替换HTML 特殊字符

逻辑很简单:preg_match_all('/(&#[0-9]+;)/'抓取所有匹配项,然后我们简单地构建一个可匹配项和可替换项列表,例如str_replace([searchlist], [replacelist], $term). 在我们这样做之前,我们还需要将命名实体转换为它们的数字对应物,即,"&nbsp;"这是不可接受的,但"&#00A0;"很好。(感谢it-alien对这部分问题的解决。

工作演示

在这个演示中,我&#123;"HTML Entity #123". 当然,您可以将其微调为您想要的任何类型的查找替换。

我为什么做这个?我使用它从 UTF8 字符编码的 HTML 生成富文本格式。

查看完整的工作演示:

完整的在线工作演示

    function FixUTF8($args) {
        $output = $args['input'];
        
        $output = convertNamedHTMLEntitiesToNumeric(['input'=>$output]);
        
        preg_match_all('/(&#[0-9]+;)/', $output, $matches, PREG_OFFSET_CAPTURE);
        $full_matches = $matches[0];
        
        $found = [];
        $search = [];
        $replace = [];
        
        for($i = 0; $i < count($full_matches); $i++) {
            $match = $full_matches[$i];
            $word = $match[0];
            if(!$found[$word]) {
                $found[$word] = TRUE;
                $search[] = $word;
                $replacement = str_replace(['&#', ';'], ['HTML Entity #', ''], $word);
                $replace[] = $replacement;
            }
        }

        $new_output = str_replace($search, $replace, $output);
        
        return $new_output;
    }
    
    function convertNamedHTMLEntitiesToNumeric($args) {
        $input = $args['input'];
        return preg_replace_callback("/(&[a-zA-Z][a-zA-Z0-9]*;)/",function($m){
            $c = html_entity_decode($m[0],ENT_HTML5,"UTF-8");
            # return htmlentities($c,ENT_XML1,"UTF-8"); -- see update below
            
            $convmap = array(0x80, 0xffff, 0, 0xffff);
            return mb_encode_numericentity($c, $convmap, 'UTF-8');
        }, $input);
    }

print(FixUTF8(['input'=>"Oggi &egrave; un bel&nbsp;giorno"]));

输入:

"Oggi &egrave; un bel&nbsp;giorno"

输出:

Oggi HTML Entity #232 un belHTML Entity #160giorno

于 2021-12-13T01:37:23.543 回答
-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
于 2015-05-13T11:32:12.563 回答
-1

你可以试试htmlspecialchars_decode($string)。这个对我有用。

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

于 2015-10-01T12:56:02.153 回答