1

我知道如果我使用多字节(UTF-8)字符作为模式,我必须使用mb_函数或必须使用函数u模式的选项preg_

但是,当我仅将多字节(UTF-8)字符用于preg_函数主题并仅将 ascii 字符用于模式时,preg_函数(无u选项)是否正常工作?

我知道在这种情况下我必须使用mb_函数或u向模式添加选项:

$str = preg_replace("/$utf8_multibyte_pattern/", '', $str);

我想知道此代码(u未使用选项)是否安全:

$ascii_pattern = "[a-zA-Z0-9'$#\\\"%&()\-~|~=!@`{}[]:;+*/.,_<>?_\n\t\r]";
$multibyte_str = preg_replace("/$ascii_pattern/", '', $utf8_multibyte_str);
4

2 回答 2

1

也许我自己找到了答案。

但是对字符代码很了解的人,请对此答案发表评论或发布另一个答案。

根据维基百科,UTF-8 字符代码不包含 ascii 代码。

http://en.wikipedia.org/wiki/UTF-8#Advantages

ASCII 字符本身被表示为不会出现在其他任何地方的单个字节,这使得 UTF-8 可以与大多数现有 API 一起使用,这些 API 采用字节字符串但只特殊处理少量 ASCII 代码。这消除了为每个 API 编写新的 Unicode 版本的需要,并且比任何其他 Unicode 编码更容易将现有系统转换为 UTF-8。

我认为这意味着没有 u 选项的带有 ascii 模式的 preg 函数对于多字节(UTF8)主题是安全的。

而这段代码(没有 u 选项)

$multibyte_str = preg_replace("/$ascii_pattern/", '', $utf8_multibyte_str);

和这段代码(带 u 选项)

$multibyte_str = preg_replace("/$ascii_pattern/u", '', $utf8_multibyte_str);

是相同的。两者都能正常工作。

我对么?

于 2012-11-08T13:48:11.990 回答
0

据我所知,只要您/u像这样使用 unicode 属性 (),它就是安全的:

$ascii_pattern = "[a-zA-Z0-9'$#\\\"%&()\-~|~=!@`{}[]:;+*/.,_<>?_\n\t\r]";
$multibyte_str = preg_replace("/$ascii_pattern/u", '', $utf8_multibyte_str);

要查看有关 unicode 字符的更多信息,请参见此处

于 2012-11-08T12:58:08.667 回答