php - 多字节字符串和环视奇怪的错误

标签 php regex

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

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 block 的脚本:

<?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,这将对大约一半的字符失败。

关于php - 多字节字符串和环视奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14941455/

相关文章:

javascript - 如何使用 JS 变量作为参数执行 sql 查询

php - PHP字符串替换无法正常工作

PHP:将匿名函数作为参数传递

regex - 使用 Rust 的正则表达式箱时如何转义转义的正则表达式字符?

python - 如何交换一串十六进制字节中的相邻字节(有或没有正则表达式)

php - 警告 mktime() 期望参数 4 为长字符串

phpbb3 对新消息的缓慢索引

java - 我们可以在没有循环语句的情况下计算字符串中的数字表达式(通过正则表达式)吗?

regex - 正则表达式在括号中查找数字,但仅在字符串的开头

regex - 这个正则表达式是什么意思/^[a-z]{1}[a-z0-9_]{3,13}$/