如何在PHP中用'*'替换不在[0x5E10,0x7F35]范围内的字符?

ope*_*nid 5 php regex hex

我不熟悉正则表达式如何处理十六进制,谁知道呢?

Ste*_*rig 15

以下是诀窍:

$str = "some ??????????";

echo preg_replace('/[\x{00ff}-\x{ffff}]/u', '*', $str);
// some **********

echo preg_replace('/[^\x{00ff}-\x{ffff}]/u', '*', $str);
// *****??????????
Run Code Online (Sandbox Code Playgroud)

重要的是u-modifier(见这里):

此修饰符打开与Perl不兼容的PCRE的其他功能.模式字符串被视为UTF-8.此修饰符可从Unix上的PHP 4.1.0或更高版本以及win32上的PHP 4.2.3获得.自PHP 4.3.5起,检查模式的UTF-8有效性.

而且在这里一个简短的说明,为什么\uFFFF不能在PHP工作:

Perl和PCRE不支持\ uFFFF语法.他们改用\ x {FFFF}.您可以在花括号之间省略十六进制数字中的前导零.由于\ x本身不是有效的正则表达式标记,因此永远不会混淆\ x {1234}以匹配\ x 1234次.它始终与Unicode代码点U + 1234匹配.\ x {} {5634}将尝试将代码点U + 1234完全匹配5678次.