如何从 PHP 字符串中删除“�”?

5
我正在阅读来自数据库的XML表中的数据。在原始输出中,我遇到了这个字符"�",它是UTF-8字符串表示"�"。使用str_replace进行简单的搜索和替换不能去除字符串中的"�"或"�"。有没有其他方法可以从字符串中删除这个字符?
更新:
供参考,这是清理字符串的函数。
    function db_utf8_convert($str)
{
    $convmap = array(0x80, 0x10ffff, 0, 0xffffff);
    return preg_replace('/\x{EF}\x{BF}\x{BD}/u', '', mb_encode_numericentity($str, $convmap, "UTF-8"));
}

第一个结果是一个SO问题,已经得到了回答:https://www.google.com/search?q=� 不确定这是否有帮助。 - The111
在提问之前,我尝试使用 PHP 等效语句,但没有成功。 - labago
1
那是UTF-8 BOM。�表示无效字符。如果您使用解析器,就不会有这个问题。 - David Heffernan
2个回答

3
你可以这样做:
$str = 'UTF-8 string meaning "�"';
echo preg_replace('/\x{EF}\x{BF}\x{BD}/u', '', iconv(mb_detect_encoding($str), 'UTF-8', $str));

输出:UTF-8字符串表示“”


我对此抱有很高的期望,但遗憾的是它对我没有起作用。 - labago
1
@jlane09 如果我的第一个答案不起作用,那是因为你的服务器使用的编码不是UTF-8,所以我为你更新了我的答案。 - PhearOfRayne
还是不想工作,但我很感激你持续的努力。 - labago
是的,我想它可能不会,因为mb_detect_encoding()非常有限!你没有将数据库和服务器的编码设置为UTF-8的原因是什么?这将防止许多未来和当前的问题。 - PhearOfRayne
我要插入这些字符串的数据库是以UTF-16编码的。我不确定它来自哪个数据库,也无法控制。它运行在UTF-8的服务器上。 - labago
你应该使用其中之一,而不是同时使用两者。 - PhearOfRayne

2
您可以类似于这样做:
<?php
$string = "asd fsa fsaf sf � asdfasdfs";

echo preg_replace("/[^\p{Latin} ]/u", "", $string);

请查看以下脚本,以获取更多字符匹配信息:
http://www.regular-expressions.info/unicode.html#script

编辑

我找到了这个,据说它有效,你可以试试:

<?php
function removeBOM($str=""){
    if(substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) {
        $str=substr($str, 3);
    }
    return $str;
}
?>

1
那也会删除许多其他字符。 - rid
这就是为什么我添加了链接,它里面有更多的组合。 - Get Off My Lawn
确实,但是列出的任何脚本都将删除属于该脚本的所有字符,而不仅仅是这3个字符。 - rid
如果有人能够发布一个仅删除BOM的preg_match,那将是非常棒的。 - labago
1
不好意思,使用那个函数仍然会出现一些小的BOM。 - labago

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