Php 多字节字符串,看看奇怪的错误
为什么以下代码对于不同的多字节字符串表现不同Php 多字节字符串,看看奇怪的错误,php,regex,Php,Regex,为什么以下代码对于不同的多字节字符串表现不同 echo preg_replace('@(?=\pL)@u', '*', 'م'); // prints: '*م' ✓ echo preg_replace('@(?=\pL)@u', '*', 'ض'); // prints: '*ض' ✓ echo preg_replace('@(?=\pL)@u', '*', 'غ'); // prints: '*�*�' ✗ echo preg_replace('@(?=\pL
echo preg_replace('@(?=\pL)@u', '*', 'م'); // prints: '*م' ✓
echo preg_replace('@(?=\pL)@u', '*', 'ض'); // prints: '*ض' ✓
echo preg_replace('@(?=\pL)@u', '*', 'غ'); // prints: '*�*�' ✗
echo preg_replace('@(?=\pL)@u', '*', 'ص'); // prints: '*�*�' ✗
请参阅:您还需要包括修饰字母(
Lm
)。请参见以下脚本,该脚本迭代整个阿拉伯文unicode块:
<?php
function uchar_2($dec)
{
$utf = chr(192 + (($dec - ($dec % 64)) / 64));
$utf .= chr(128 + ($dec % 64));
return $utf;
}
$issues = 0;
$count = 0;
for ($dec = 1536; $dec <= 1791; $dec++) {
$char = uchar_2($dec);
if (preg_replace('@^(?=\pLm)$@u', '*', $char) !== $char) {
printf("Issue with %s (%s)\n", $dec, $char);
$issues++;
}
$count++;
}
printf("Found %d issues in %d rows\n", $issues, $count);
它不能将غ
识别为字符。嗯,这看起来像是PCRE库中的一个bug,但是,作为PHP,很难说是否需要启用某些功能……这工作正常:echo preg_replace('/(.+)/','*$1',غ');奇怪的是,它似乎在旧版本中起作用:@deceze感谢您提供的信息+1对于链接字符串,使用PHP进行操作非常痛苦。我希望PHP6将在本世纪发布。在您的代码中,即使使用'@^(?=\pL)$@u'
也不会返回任何问题。但是如果使用'@(?=\pL)@u',它会返回一些问题。在代码中,使用\pLm
显示所需的输出。但它也必须与\pL
一起工作。