在寻找帮助消毒某些输出的解决方案的过程中,我遇到了执行以下操作的代码。
preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $some_url)
现在,我认为它基本上试图删除除上述字符之外的任何内容。但是不是\\x80-\\xff
指的是某种形式的不可打印的ascii字符吗?如果是这样,为什么代码可能会尝试不删除它们?
任何迹象/指示/帮助将不胜感激。感谢。
答案 0 :(得分:7)
好的,到目前为止给出的所有答案都引导我朝着正确的方向前进,并允许我在documentation中找到以下内容。
在\ x之后,最多读取两个十六进制数字(字母可以在 大写或小写)。在UTF-8模式下,允许使用\ x {...},其中 大括号的内容是一串十六进制数字。它是 解释为UTF-8字符,其代码编号是给定的 十六进制数。原始十六进制转义序列\ xhh, 如果值大于127,则匹配两个字节的UTF-8字符。
所以,作为总结: -
i)' \ x'允许十六进制转义序列,之后读取最多两个十六进制数字
ii)' \ xhh'两个' hh'字母可以是大写或小写
iii)' \ xhh'指定0-FF
范围内的代码点iv)' \ x80- \ xFF'是指ASCII
之外的字符范围答案 1 :(得分:3)
x80
- xFF
是非ASCII字符范围。它们仍然可以在Latin-1中打印,或者为UTF-8编码更高的代码点。
使用\\x80
而不是\x80
稍微更正确一些。反斜杠在字符串中自行转义。在单引号字符串中,虽然它在那里实际上无关紧要。
在双引号字符串中,但仅使用\x80
将由PHP解释,而\\x80
将由正则表达式引擎查看和解释。
答案 2 :(得分:1)
你不需要在PHP模式中使用双反斜杠,但是即使你使用它,它也会被忽略并作为转义读取(就像一个简单的反斜杠)。
一个例外,如果使用heredoc或nowdoc语法来封装模式,则会将双反斜杠视为文字反斜杠。
答案 3 :(得分:0)
ASCII 字符的 UTF-8 字节序列是 1 个字节,如 double
,因此它匹配 0xxxxxxx
。
如果一个字符不是 ASCII 意味着它有超过 1 个字节,在这种情况下,字节将用前导 \x00-\x7f
来描述
来自wikipedia的部分表格
1
so num of bytes
1 0xxxxxxx
2 110xxxxx 10xxxxxx
3 1110xxxx 10xxxxxx 10xxxxxx
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
匹配多字节字符中的 \x80-\xff
个字节,因此基本上是非 ASCII 字符。