用PHP替换'字符

时间:2010-04-29 22:03:33

标签: php replace special-characters

我很难尝试替换这个奇怪的右单引号字符。我正在使用这样的str_replace:

str_replace("’", '\u1234', $string);

看起来我无法弄清楚引用的真正含义。即使我直接从PHPMyAdmin复制粘贴它仍然无法正常工作。我不得不以某种方式逃脱它吗?

角色: http://www.lukomon.com/Afbeelding%204.png

  • MySQL Charset:UTF-8 Unicode(utf8)
  • MySQL排序规则:utf8_unicode_ci
  • <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

编辑: 事实证明这是一个微软左单引号,我可以用Phill Paffords评论中的this function替换它。我不确定我现在要标记哪个答案..

10 个答案:

答案 0 :(得分:8)

这也发生在我身上。几件事:

  • 使用htmlentities功能为您的文字

    $my_text = htmlentities($string, ENT_QUOTES, 'UTF-8');

<强> More info about the htmlentities function.

  • 使用正确的文档类型,这对我有用。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  • 在您的网页中使用 utf-8 编码类型:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

以下是您网页的最终原型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>    
<body>

<?php     
    // your code related to database        
    $my_text = htmlentities($string, ENT_QUOTES, 'UTF-8');    
?>

</body>
</html>

如果您想替换,请尝试使用mb_ereg_replace功能。

示例:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

$my_text = mb_ereg_replace("’","'", $string);

答案 1 :(得分:3)

我遇到了同样的问题并发现了这个问题:

function replace_rsquote($haystack,$replacewith){
   $pos = strpos($haystack,chr("226"));
   if($pos > -1){
       return substr_replace($haystack,$replacewith,$pos,3);
   } else return $haystack;
}

示例:

echo replace_rsquote("Nick’s","'"); //Nick's

答案 2 :(得分:2)

要查找它是什么字符,请通过ord函数运行它,它将为您提供字符的ASCII代码:

echo ord('’'); // 226

现在您知道它是什么,您可以这样做:

str_replace('’', chr(226), $string);

答案 3 :(得分:1)

要替换它:

如果您的脚本文件使用与您尝试进行替换的数据相同的编码进行编码,则它应该按照您发布的方式工作。如果您正在使用UTF-8数据,请确保脚本使用UTF-8进行编码,并且在粘贴时,您的编辑器不会默默地音译该字符。

如果它不起作用,请尝试按下面所述转义它,看看它返回的是什么代码。

逃避它:

如果您的源文件是以UTF-8编码的,那么这应该有效:

$string = htmlentities($string, ENT_QUOTES, "UTF-8");

html...的默认字符集为iso-8859-1。必须明确说明与此不同的任何内容。

对于更复杂的字符转换问题,请务必查看用户贡献的注释以查找htmlentities()等函数,通常可以在那里找到真正的宝石。

一般情况:

Bobince在他的评论中是正确的,系统性字符集问题应该系统地排序,这样他们就不会咬你了 - 如果只是通过定义在每一步中使用哪个字符集:

  • 脚本文件的编码方式;
  • 如何提供文件;
  • 数据如何存储在数据库中;
  • 如何编码数据库连接。

答案 4 :(得分:1)

如果在PHP代码中使用非ASCII字符,则需要确保使用与正在处理的数据相同的字符编码。您的尝试可能会失败,因为您在PHP脚本中使用的字符编码与$string中的字符编码不同。

此外,如果您使用的是UTF-8等多字节字符编码,则还应使用multibyte aware string functions

答案 5 :(得分:1)

Gumbo sad right -
- 将脚本保存为utf-8文件
- 并使用http://php.net/mbstring(正如Sarfraz在他的最后一个例子中指出的那样)

答案 6 :(得分:0)

为什么不通过htmlspecialchars()运行字符串并输出它以查看它将该字符转换为什么,以便您知道要用作替换表达式?

答案 7 :(得分:0)

你拥有的这个角色是Right Single Quotation Mark

要用模式替换它,你会想要做这样的事情

$string = preg_replace( "/\\x{2019}/u", 'replacement', $string );

但这真的只能解决症状。问题在于,在其他应用程序中,您没有在整个应用程序中始终如一地使用字符编码。

答案 8 :(得分:0)

不要使用任何正则表达式函数(preg_replace或mb_ereg_replace)。他们为此付出沉重的代价。

str_replace(chr(226),'\u2019' , $string);

如果您的针是多字节字符,那么您可以通过这个定制功能获得更好的运气:

<?php 
function mb_str_replace($needle, $replacement, $haystack) {
    $needle_len = mb_strlen($needle);
    $replacement_len = mb_strlen($replacement);
    $pos = mb_strpos($haystack, $needle);
    while ($pos !== false)
    {
        $haystack = mb_substr($haystack, 0, $pos) . $replacement
                . mb_substr($haystack, $pos + $needle_len);
        $pos = mb_strpos($haystack, $needle, $pos + $replacement_len);
    }
    return $haystack; 
} 
?>

归功于最后一项功能:http://www.php.net/manual/en/ref.mbstring.php#86120

答案 9 :(得分:0)

您可以使用ord获取char ascii代码,然后将其替换为您想要的字符:

$asciicode = ord('’'); // 146
$stringfixed = str_replace(chr($asciicode), '\'', $string);