我有一个带有一些字符串的变量,例如:
$var = "myText";
我想要做的是在单个引号('
)的最后一个单词之前“注入”,所以输出将是:
myTex't
我有这段代码:
$var = "myText";
$var = substr_replace($var, "'", strlen($var)-1, 0);
echo $var;
它运作良好。唯一的问题是,当我尝试将其实现为另一种语言(在这种情况下是希伯来语)时,我会得到更多的字符。例如,对于那个输入:
עברית
我期待结果:עברי'ת
但相反,我得到了这样的结果:עברי�'�
有什么想法吗?
P.S。希伯来语是从左到右的语言
答案 0 :(得分:4)
您使用的是多字节字符串,而substr_replace与多字节兼容。
这是一个完全模仿substr_replace()行为的版本:(来自substr_replace PHP手册用户评论)
<?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);
}
}
?>
答案 1 :(得分:1)
这是因为您正在使用unicode多字节字符串。 substr_replace()
按字节顺序工作。因此,如果您只是替换最后一个字节,它可能会破坏最后一个字符(如果这是一个多字节字符)。
使用可以使用preg_replace
代替substr_replace()
,如果您通过u
选项,则可以使用unicode:
preg_replace('~(.)$~u', '\'$1', $string);