\\ x80 - \\ xFF是指什么?

时间:2014-09-23 04:22:14

标签: php regex

在寻找帮助消毒某些输出的解决方案的过程中,我遇到了执行以下操作的代码。

preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $some_url)

现在,我认为它基本上试图删除除上述字符之外的任何内容。但是不是\\x80-\\xff指的是某种形式的不可打印的ascii字符吗?如果是这样,为什么代码可能会尝试不删除它们?

任何迹象/指示/帮助将不胜感激。感谢。

4 个答案:

答案 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 字符。