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

发布于 2024-08-30 13:01:50 字数 31 浏览 2 评论 0原文

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

I'm not familiar with the how regular expressions treat hexadecimal, anyone knows?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萤火眠眠 2024-09-06 13:01:50

下面的方法可以解决这个问题:

$str = "some മനുഷ്യന്റെ";

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

echo preg_replace('/[^\x{00ff}-\x{ffff}]/u', '*', $str);
// *****മനുഷ്യന്റെ

重要的是 u-修饰符(请参阅 此处):

此修饰符会开启额外的
PCRE 的功能是
与 Perl 不兼容。图案
字符串被视为 UTF-8。这
PHP 4.1.0 起提供了修饰符
Unix 上或更高版本以及 PHP 4.2.3 起
在 win32 上。 UTF-8 的有效性
从 PHP 4.3.5 开始检查模式。

此处简短描述了为什么 \uFFFF 不是使用 PHP 工作:

Perl 和 PCRE 不支持
\uFFFF 语法。他们使用 \x{FFFF}
反而。您可以省略前导零
之间的十六进制数
大括号。因为 \x 本身就是
不是有效的正则表达式标记,\x{1234} 可以
永远不要混淆匹配 \x 1234
次。它始终与 Unicode 匹配
代码点 U+1234。 \x{1234}{5678} 将
尝试完全匹配代码点 U+1234
5678次。

The following does the trick:

$str = "some മനുഷ്യന്റെ";

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

echo preg_replace('/[^\x{00ff}-\x{ffff}]/u', '*', $str);
// *****മനുഷ്യന്റെ

The important thing is the u-modifier (see here):

This modifier turns on additional
functionality of PCRE that is
incompatible with Perl. Pattern
strings are treated as UTF-8. This
modifier is available from PHP 4.1.0
or greater on Unix and from PHP 4.2.3
on win32. UTF-8 validity of the
pattern is checked since PHP 4.3.5.

And here a short description why \uFFFF is not working in PHP:

Perl and PCRE do not support the
\uFFFF syntax. They use \x{FFFF}
instead. You can omit leading zeros in
the hexadecimal number between the
curly braces. Since \x by itself is
not a valid regex token, \x{1234} can
never be confused to match \x 1234
times. It always matches the Unicode
code point U+1234. \x{1234}{5678} will
try to match code point U+1234 exactly
5678 times.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文