我正在为我想要删除 HTML 标记的应用程序创建一个 RSS 提要文件,该文件由strip_tags
. 但strip_tags
不删除 HTML 特殊代码字符:
& ©
等等
请告诉我任何可以用来从字符串中删除这些特殊代码字符的函数。
我正在为我想要删除 HTML 标记的应用程序创建一个 RSS 提要文件,该文件由strip_tags
. 但strip_tags
不删除 HTML 特殊代码字符:
& ©
等等
请告诉我任何可以用来从字符串中删除这些特殊代码字符的函数。
使用解码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);
用于html_entity_decode
转换 HTML 实体。
您需要设置字符集以使其正常工作。
除了上面的好答案,PHP 还有一个非常有用的内置过滤器函数:filter-var。
要删除 HMTL 字符,请使用:
$cleanString = filter_var($dirtyString, FILTER_SANITIZE_STRING);
更多信息:
您可能想在这里查看 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 "walk" the <b>dog</b> now
echo $b; // I'll "walk" the <b>dog</b> now
这可能适用于删除特殊字符。
$modifiedString = preg_replace("/[^a-zA-Z0-9_.-\s]/", "", $content);
一种简单的香草字符串方式,无需使用 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;
}
我所做的是使用:html_entity_decode
,然后使用strip_tags
删除它们。
试试这个
<?php
$str = "\x8F!!!";
// Outputs an empty string
echo htmlentities($str, ENT_QUOTES, "UTF-8");
// Outputs "!!!"
echo htmlentities($str, ENT_QUOTES | ENT_IGNORE, "UTF-8");
?>
如果您想转换HTML 特殊字符,而不仅仅是删除它们以及剥离内容并准备纯文本,那么这就是对我有用的解决方案......
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 转换'
htmlspecialchars_decode 之类的东西html_entity_decode 之类的东西&
转换之类的东西'<
strip_tags 删除任何剩余的 HTML 标签。
编辑- 添加 str_replace(' ', ' ', $str); 和其他几个 html_entity_decode() 继续测试表明需要它们。
看起来你真正想要的是:
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);
}
它将命名实体替换为它们的等价物。
<?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
?>
我用来执行任务的函数,加入 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 中
如果您在 WordPress 中工作并且像我一样只需要检查一个空字段(并且在看起来像一个空白字符串的地方有大量随机 html 实体),那么请查看:
sanitize_title_with_dashes( string $title, string $raw_title = '', string $context = 'display' )
对于不使用 WordPress 的人,我发现这个功能对于创建我自己的消毒剂非常有用,看看完整的代码,它真的很深入!
毕竟,看看你的例子......
& ©
如果您将其剥离为 RSS 提要,您不应该想要等价物吗?
" ", &, ©
或者,也许您并不完全想要等价物。 也许您
只想被忽略(以防止太多空间),但©
实际上已被替换。让我们制定一个解决方案来解决这个问题的任何人的版本......
逻辑很简单:preg_match_all('/(&#[0-9]+;)/'
抓取所有匹配项,然后我们简单地构建一个可匹配项和可替换项列表,例如str_replace([searchlist], [replacelist], $term)
. 在我们这样做之前,我们还需要将命名实体转换为它们的数字对应物,即," "
这是不可接受的,但"�A0;"
很好。(感谢it-alien对这部分问题的解决。)
在这个演示中,我{
用"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 è un bel giorno"]));
输入:
"Oggi è un bel giorno"
输出:
Oggi HTML Entity #232 un belHTML Entity #160giorno
$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
你可以试试htmlspecialchars_decode($string)
。这个对我有用。
http://www.w3schools.com/php/func_string_htmlspecialchars_decode.asp