Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多字节字符串,看看奇怪的错误_Php_Regex - Fatal编程技术网

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
一起工作。