substra_replace函数将奇怪的符号与字符串一起返回


substr_replace function returns weird symbols along with the string

我有一个变量,里面有一些字符串,例如:

$var = "myText";

我想做的是在最后一个单词之前"注入"一个单引号('),这样输出将是:

myTex't

我有这个代码:

$var = "myText";
$var = substr_replace($var, "'", strlen($var)-1, 0);
echo $var;

而且效果很好。唯一的问题是,当我试图将它实现到另一种语言(在本例中为希伯来语)时,我会得到额外的字符。例如,对于该输入:

עברית我期待的结果是:עברי'ת,但结果却是:עברי�'�

有什么想法吗?

p.S.希伯来语是从右到左的语言

您使用的是多字节字符串,而substra_replace与多字节不兼容。

下面是一个完全模仿substra_replace()行为的版本:(来自substra_replacePHP手册用户评论)

<?php
if (function_exists('mb_substr_replace') === false)
 {
     function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = null)
     {
         if (extension_loaded('mbstring') === true)
         {
             $string_length = (is_null($encoding) === true) ? mb_strlen($string) : mb_strlen($string, $encoding);
             if ($start < 0)
             {
                 $start = max(0, $string_length + $start);
             }
             else if ($start > $string_length)
             {
                 $start = $string_length;
             }
             if ($length < 0)
             {
                 $length = max(0, $string_length - $start + $length);
             }
             else if ((is_null($length) === true) || ($length > $string_length))
             {
                 $length = $string_length;
             }
             if (($start + $length) > $string_length)
             {
                 $length = $string_length - $start;
             }
             if (is_null($encoding) === true)
             {
                 return mb_substr($string, 0, $start) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length);
             }
             return mb_substr($string, 0, $start, $encoding) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length, $encoding);
         }
         return (is_null($length) === true) ? substr_replace($string, $replacement, $start) : substr_replace($string, $replacement, $start, $length);
     }
 }
?>

这是因为您使用的是unicode多字节字符串。substr_replace()按字节工作。因此,如果您只是替换最后一个字节,它可能会破坏最后一个字符(如果这是一个多字节字符)。

Use可以使用preg_replace而不是substr_replace(),如果您传递u选项:,它是unicode安全的

preg_replace('~(.)$~u', '''$1', $string);