从 PHP 字符串中删除奇怪的字符

28

这是我现在拥有的内容

将RSS源绘制到php中,从rss源中读取的原始xml如下:

Paul’s Confidence

我目前的 PHP 代码是这样的。

$newtitle = $item->title;
$newtitle = utf8_decode($newtitle);

上述代码返回:

Paul?s Confidence

如果我去掉 utf_decode,我会得到这个结果

Paul’s Confidence

当我尝试使用str_replace函数时;

$newtitle = str_replace("”", "", $newtitle);

它不起作用,我得到了;

Paul’s Confidence

有什么想法吗?


1
在你的第一个代码块中,你写了 ’ 在你的 str_replace() 中,你写了 ” 这会影响结果吗? - sshow
4
我会尽力进行翻译,请问需要翻译的内容是:“I would say the character encoding of the page you're trying to show the string on could be affecting your result... is the above output on any web page somewhere we could peek at for reference (when I test locally I don't get any funky output, just a single quote)”? - Ian Selby
反馈地址为:http://claygroup.org/blog/feed/ @sshow 是打字错误。 - mrpatg
14个回答

25

这是我编写的一个函数,无论编码如何都能正常工作:

function RemoveBS($Str) {  
  $StrArr = str_split($Str); $NewStr = '';
  foreach ($StrArr as $Char) {    
    $CharNo = ord($Char);
    if ($CharNo == 163) { $NewStr .= $Char; continue; } // keep £ 
    if ($CharNo > 31 && $CharNo < 127) {
      $NewStr .= $Char;    
    }
  }  
  return $NewStr;
}

工作原理:

echo RemoveBS('Hello õhowå åare youÆ?'); // Hello how are you?

这不会保留UTF8编码。 - besimple
我不认为它应该这样 - 话虽如此,您可以之后编码为UTF-8或根据自己的需求修改该函数! - David D
1
有很多文档讨论将字符编码指定为utf-8......但这是唯一真正为我工作的事情!我将阅读ord函数的相关资料。谢谢!!! - rikkitikkitumbo
万岁 RemoveBS()!对我有用! - eliotRosewater

23

15

这将从字符串中移除所有的非ASCII字符/特殊字符。

//Remove from a single line string
$output = "Likening ‘not-critical’ with";
$output = preg_replace('/[^(\x20-\x7F)]*/','', $output);
echo $output;
 
//Remove from a multi-line string
$output = "Likening ‘not-critical’ with \n Likening ‘not-critical’ with \r Likening ‘not-critical’ with. ' ! -.";
$output = preg_replace('/[^(\x20-\x7F)\x0A\x0D]*/','', $output);
echo $output;


感谢您还提供了多行解决方案。 - Jasper Briers

10

我解决了这个问题。似乎只是一个简单的修复而不是更大的问题,但它起作用了。

$newtitle = str_replace('’', "'", $newtitle);

我还发现了这个有用的代码片段,它可能会帮助其他遇到同样问题的人;

<?
$find[] = '“'; // left side double smart quote
$find[] = 'â€'; // right side double smart quote
$find[] = '‘'; // left side single smart quote
$find[] = '’'; // right side single smart quote
$find[] = '…'; // elipsis
$find[] = '—'; // em dash
$find[] = '–'; // en dash

$replace[] = '"';
$replace[] = '"';
$replace[] = "'";
$replace[] = "'";
$replace[] = "...";
$replace[] = "-";
$replace[] = "-";

$text = str_replace($find, $replace, $text);
?>

感谢大家抽出时间考虑。


这在Linux系统上可能无法正常工作,因为“php”文件的编码可能不同,导致特殊字符无效。只是提供一下信息。 - Jakub
是的,这对我不起作用。有什么解决方法吗? - vaichidrewar
2
你需要在数组末尾放置“—”(右侧双智能引号),否则它将匹配任何以“—”开头的内容。 - Zoot

7
“这对我没用。有什么解决方法吗?” - vaichidrewar Mar 12 at 22:29
将以下代码添加到HTML头部(如果已经存在,则进行修改):
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

这将会对像““”这样的奇怪字符进行UTF-8编码,以便str_replace()函数能够正确解释它们。

或者您可以这么做:

ini_set('default_charset', 'utf-8');

2
你的PHP服务器的字符编码设置是否为UTF-8以外的其他编码?如果是,有没有什么原因或者可以将其改为UTF-8?虽然我们在数据库中不存储UTF-8数据,但我发现将Web服务器的字符集设置为UTF-8似乎有助于解决字符集问题。
我很想听听其他人对此的看法......如果我将Web服务器设置为UTF-8,同时将提交的数据存储在我们的MySQL数据库中的Latin1中,我是否会遇到问题。我知道我选择Latin1作为数据库的原因,但我不记得是什么了。有趣的是,我们目前的设置似乎允许输入和呈现非UTF-8字符......似乎存储在Latin1中并不会防止所有UTF-8字符的后续解码和显示?

2
使用以下PHP代码来删除:
html_entity_decode(mb_convert_encoding(stripslashes($name), "HTML-ENTITIES", 'UTF-8'))

1
超级简单的解决方案是在页面加载时对字符进行解码。
只需将以下内容复制/粘贴到脚本开头即可。
 header('Content-Type: text/html; charset=UTF-8');

 mb_internal_encoding('UTF-8');  
 mb_http_output('UTF-8'); 
 mb_http_input('UTF-8');  
 mb_regex_encoding('UTF-8');

参考资料: http://php.net/manual/zh/function.mb-internal-encoding.php 留言来自 webfav 在 web dot de


1

通过在mysql连接代码下方应用mysqli_set_charset($con,"utf8");,可以删除许多奇怪的字符。

但在某些情况下,如删除â€这种奇怪字符时,我们需要使用:$title = ' Stefen Suraj'; $newtitle = preg_replace('/[^(\x20-\x7F)]*/','', $title); echo $newtitle;

输出将会是:Stefen Suraj


mysqli_set_charset($con,"utf8"); 是有帮助的。 - softech

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接