1

您好遇到以下问题

首先:如果 ÄÖÜ 提供了正则表达式,则商标符号替换会产生额外的字符 ...:

第二:如果我对结果进行字符串循环,所有特殊字符都是�。

问题是,为什么会发生这种情况,我该怎么做呢?(第二个问题不是那么必要,但很有趣)

header('Content-Type: text/html; charset=utf-8');
$testtxt = 'MicrÖsüft W!ndows® is a trÄdemark of Microfrost™ ©2012!';

$r =  preg_replace('#[^\w\s\däöüß%\!\?\.,\:\-_\[\]ÄÖÜ]#is', 'X', $testtxt);
echo $testtxt, '<br>', $r;
echo '<hr>';
for($i = 0, $size = strlen($r); $i < $size; ++$i) {
    echo $r[$i], '=', ord($r[$i]), '<br>';
}

结果:

MicrÖsüft W!ndows® is a trÄdemark of Microfrost™ ©2012!
MicrÖsüft W!ndowsXX is a trÄdemark of MicrofrostX�X XX2012!
M=77
i=105
c=99
r=114
�=195
�=150....

预期的:

MicrÖsüft W!ndows® is a trÄdemark of Microfrost™ ©2012!
MicrÖsüft W!ndowsXX is a trÄdemark of MicrofrostXX XX2012!
M=77
i=105
c=99
r=114
Ö=195
s=150....
4

2 回答 2

2

您正在使用与多字节字符不兼容的 strlen 和 ord 函数。以下代码应显示每个字符的字节数:

for($i = 0, $size = mb_strlen($r); $i < $size; ++$i) {
    echo $r[$i], '=', strlen($r[$i]), '<br>';
}

其次,您应该将 UTF-8 修饰符添加到您的正则表达式中:

$r =  preg_replace('#[^\w\s\däöüß%\!\?\.,\:\-_\[\]ÄÖÜ]#isu', 'X', $testtxt)
于 2012-06-25T17:34:36.283 回答
0

我不太确定,但您可以尝试将“u”修饰符添加到 preg_replace() 中的正则表达式。或尝试使用mb_eregi_replace()

另外,您确定可以使用 ord() 吗?手册中写到它返回ASCII值(我强烈怀疑,这意味着对于多字节字符,它将返回第一个字节的值)。

于 2012-06-25T17:15:44.500 回答