php – 多字节字符串和环视奇怪的bug

为什么以下代码对于不同的多字节字符串表现不同?

echo preg_replace('@(?=\pL)@u','*','م');  // prints: '*م'     ✓ 
echo preg_replace('@(?=\pL)@u','ض');  // prints: '*ض'     ✓ 
echo preg_replace('@(?=\pL)@u','غ');  // prints: '*�*�'   ✗ 
echo preg_replace('@(?=\pL)@u','ص');  // prints: '*�*�'   ✗

见:http://3v4l.org/fvab1

解决方法

您还需要包含修饰符(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);

如果没有Lm,大约一半的角色都会失败.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...