Php 使用带有ascii字符模式和utf-8多字节主题的preg_uu函数安全吗?

Php 使用带有ascii字符模式和utf-8多字节主题的preg_uu函数安全吗?,php,preg-replace,Php,Preg Replace,我知道,如果我使用多字节(UTF-8)字符作为模式,我必须使用mb_函数,或者必须使用u选项作为preg_函数的模式 但是,当我仅对preg\u函数的主题使用多字节(UTF-8)字符,并且仅对模式使用ascii字符时,preg\u函数(不带u选项)是否正常工作 我知道在这种情况下,我必须使用mb_函数或向模式添加u选项: $str = preg_replace("/$utf8_multibyte_pattern/", '', $str); 我想知道此代码(u选项未使用)是否安全: $ascii

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

但是,当我仅对
preg\u
函数的主题使用多字节(UTF-8)字符,并且仅对模式使用ascii字符时,
preg\u
函数(不带
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);
$ascii\u pattern=“[a-zA-Z0-9'$\\\\\\”%&()\-~\\\\\=!@`{}[]:;+*/,\u?\ n\t\r]”;
$multibyte_str=preg_replace(“/$ascii_pattern/”,“”,$utf8_multibyte_str);

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

$ascii\u pattern=“[a-zA-Z0-9'$\\\\\\”%&()\-~\\\\\=!@`{}[]:;+*/,\u?\ n\t\r]”;
$multibyte_str=preg_replace(“/$ascii_pattern/u”,“'.$utf8_multibyte_str”);

要查看有关unicode字符的详细信息,请参见

据我所知,只要您使用unicode属性(
/u
),就安全了,如下所示:

$ascii\u pattern=“[a-zA-Z0-9'$\\\\\\”%&()\-~\\\\\=!@`{}[]:;+*/,\u?\ n\t\r]”;
$multibyte_str=preg_replace(“/$ascii_pattern/u”,“'.$utf8_multibyte_str”);

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

也许我自己找到了答案

但是,如果您对字符代码非常了解,请对此答案发表评论或发布另一个答案。

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

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

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

和此代码(不带u选项)

和此代码(带u选项)

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


我说的对吗?

也许我自己找到了答案

但是,如果您对字符代码非常了解,请对此答案发表评论或发布另一个答案。

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

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

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

和此代码(不带u选项)

和此代码(带u选项)

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


我说的对吗?

如果你在结尾使用
/u
(unicode属性)是的。看一看。如果你在结尾使用
/u
(unicode属性)是的。看一看。谢谢。但是我知道如果我使用/u是安全的。问题是如果我不使用/u并且在模式中不使用多字节字符串(第一个参数),它是否安全但是对主题使用多字节字符串(第三个参数)。谢谢。但是我知道如果我使用/u是安全的。问题是如果我不使用/u并且在模式中不使用多字节字符串(第一个参数),但对主题使用多字节字符串(第三个参数),那么它是否安全.完全正确。在UTF-8中,多字节字符不使用ascii范围的字节
[\x00-\x7f]
。在这种情况下,使用u修饰符是没有用的。也就是说,在使用像
\d
\w
这样的速记字符类时要小心,因为它不包含带和不带u修饰符的相同字符。这是绝对正确的。在UTF-8中,多字节字符不使用ascii范围的字节
[\x00-\x7f]
。在这种情况下,使用u修饰符是没有用的。也就是说,在使用像
\d
\w
这样的速记字符类时要小心,因为它不包含带和不带u修饰符的相同字符。
$ascii_pattern = "[a-zA-Z0-9'$#\\\"%&()\-~|~=!@`{}[]:;+*/.,_<>?_\n\t\r]";
$multibyte_str = preg_replace("/$ascii_pattern/u", '', $utf8_multibyte_str);
$multibyte_str = preg_replace("/$ascii_pattern/", '', $utf8_multibyte_str);
$multibyte_str = preg_replace("/$ascii_pattern/u", '', $utf8_multibyte_str);