【问题标题】:Is it safe to use preg_ functions with ascii-character pattern and utf-8 multibyte subject?使用带有 ascii 字符模式和 utf-8 多字节主题的 preg_ 函数是否安全?
【发布时间】:2012-11-08 12:35:13
【问题描述】:

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

但是,当我仅对 preg_ 函数的主题使用多字节 (UTF-8) 字符并且仅对模式使用 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);

【问题讨论】:

  • 是的,如果你在最后使用/u(unicode 属性)。看看here

标签: php preg-replace


【解决方案1】:

也许我自己找到了答案。

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

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

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

ASCII 字符本身表示为单个字节,不会出现在其他任何地方,这使得 UTF-8 可以与大多数接受字节字符串但仅特殊处理少量 ASCII 代码的现有 API 一起使用。这消除了为每个 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);

都是一样的。 两者都能正常工作。

我说的对吗?

【讨论】:

  • 绝对正确。在 UTF-8 中,多字节字符不使用 ascii 范围 [\x00-\x7f] 的字节。在这种情况下,使用 u 修饰符是没有用的。也就是说,当你使用像 \d\w 这样的速记字符类时要小心,因为它不包含带有和不带有 u 修饰符的相同字符。
【解决方案2】:

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

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

要查看有关 unicode 字符的更多信息,请参阅here

【讨论】:

  • 谢谢。但我知道如果我使用 /u 是安全的。问题是如果我不使用 /u 并且不在模式中使用多字节字符串(第一个参数)但使用多字节字符串作为主题(第三个参数)是否安全。
猜你喜欢
  • 2011-04-19
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
相关资源
最近更新 更多