在寻找帮助消毒某些输出的解决方案的过程中,我遇到了执行以下操作的代码.
preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $some_url)
Run Code Online (Sandbox Code Playgroud)
现在,我认为它基本上试图删除除上述字符之外的任何内容.但是没有\\x80-\\xff
提到某种形式的不可打印的ascii字符?如果是这样,为什么代码可能会尝试不删除它们?
任何迹象/指针/帮助将不胜感激.谢谢.
好的,到目前为止给出的所有答案都引导我朝着正确的方向前进,并允许我在文档中找到以下内容.
在\ x之后,最多读取两个十六进制数字(字母可以是大写或小写).在UTF-8模式下,允许使用\ x {...},其中大括号的内容是一串十六进制数字.它被解释为UTF-8字符,其代码编号是给定的十六进制数.如果值大于127,则原始十六进制转义序列\ xhh匹配双字节UTF-8字符.
所以,作为总结: -
i)'\ x'允许十六进制转义序列,在此之后,最多读取两个十六进制数字
ii)'\ xhh'两个'hh'字母可以是大写或小写
iii)'\ xhh'指定0-FF范围内的代码点
iv)'\ x80-\xFF'是指ASCII之外的字符范围
x80
-xFF
是非 ASCII 字符范围。它们仍然可以打印,无论是用 Latin-1 还是为 UTF-8 编码更高的代码点。
使用\\x80
over\x80
稍微正确一些。反斜杠在字符串中转义。在单引号字符串中也是如此,尽管它在那里实际上无关紧要。
在双引号中,使用 just\x80
会被 PHP 解释,而\\x80
被正则表达式引擎看到和解释。