我有一个字符串,我想将所有'a'字符替换为希腊字母'α'。我不想转换字符串中的html元素,即<a href="http://a-url-with-a-characters">text</a>
。
功能:
function grstrletter($string){
$skip = false;
$str_length = strlen($string);
for ($i=0; $i < $str_length; $i++){
if($string[$i] == '<'){
$skip = true;
}
if($string[$i] == '>'){
$skip = false;
}
if ($string[$i]=='a' && !$skip){
$string[$i] = 'α';
}
}
return $string;
}
我所做的另一项功能完美无缺,但它没有考虑到hmtl元素。
function grstrletter_no_html($string){
return strtr($string, array('a' => 'α'));
}
我也尝试了很多php提供的编码功能而没有运气。
当我回复希腊字母时,浏览器输出它没有问题。当我返回字符串时,浏览器会在发生替换时在三角形内输出经典的奇怪问号。
我的标题有<meta http-equiv="content-type" content="text/html; charset=UTF-8">
,我也尝试使用php header('Content-Type: text/html; charset=utf-8');
,但又没有运气。
该字符串来自UTF-8中的数据库,该站点位于wordpress中,所以我只使用wordpress函数来获取我想要的内容。我不认为是db问题,因为当我使用我的函数grstrletter_no_html()
时,一切正常。
当我逐个字符地迭代字符串时,问题似乎发生了。
文件保存为UTF-8,没有BOM(记事本++)。我也试图改变文件的编码而没有再好运。
我还尝试用相应的html实体α
和α
替换希腊字母,但同样的结果也是如此。
我还没有尝试任何正则表达式。
我希望得到任何帮助和提前感谢。
尝试:Greek characters encoding works in HTML but not in PHP
修改
基于 deceze 精彩回答的解决方案:
function grstrletter($string){
$skip = false;
$str_length = strlen($string);
for ($i=0; $i < $str_length; $i++){
if($string[$i] == '<'){
$skip = true;
}
if($string[$i] == '>'){
$skip = false;
}
if ($string[$i]=='a' && !$skip){
$part1 = substr($string, 0, $i);
$part1 = $part1 . 'α';
$string = $part1 . substr($string, $i+1);
}
}
return $string;
}
答案 0 :(得分:2)
问题是你只设置字符串的一个字节。例如:
$str = "\x00\x00\x00";
var_dump(bin2hex($str));
$str[1] = "\xff\xff";
var_dump(bin2hex($str));
输出:
string(6) "000000"
string(6) "00ff00"
您正在设置一个双字节字符,但实际上只有一个字节被压入字符串。这里的第二个结果必须是00ffff
才能使代码正常工作。
您需要的是将字符串从0
剪切到$i - 1
,将'α'
连接到其中,然后将字符串$i + 1
的其余部分连接到它上面如果要插入多字节字符。那,或使用mbstring函数使用字符而不是字节。
有关更多背景信息,请参阅What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。