Php \\x80-\\xFF指的是什么?
在寻找解决方案帮助清理某些输出的过程中,我遇到了执行以下操作的代码Php \\x80-\\xFF指的是什么?,php,regex,Php,Regex,在寻找解决方案帮助清理某些输出的过程中,我遇到了执行以下操作的代码 preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $some_url) 现在,我认为它基本上是试图删除除上述字符以外的任何字符。但是\\x80-\\xff不是指某种形式的不可打印ascii字符吗?如果是这样,为什么代码可能会尝试不删除它们 如有任何指示/指示/帮助,将不胜感激。谢谢。您不需要在PHP模式中使用双反斜杠,但是即使您使用它
preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $some_url)
现在,我认为它基本上是试图删除除上述字符以外的任何字符。但是\\x80-\\xff
不是指某种形式的不可打印ascii字符吗?如果是这样,为什么代码可能会尝试不删除它们
如有任何指示/指示/帮助,将不胜感激。谢谢。您不需要在PHP模式中使用双反斜杠,但是即使您使用它,它也会被忽略并作为转义读取(就像一个简单的反斜杠)
一个例外情况是,如果使用herdoc或nowdoc语法来括起模式,则双反斜杠被视为文字反斜杠。
x80
-xFF
是非ASCII字符范围。它们仍然可以打印,都是拉丁语-1,或者为UTF-8编码更高的代码点
在\x80
上使用\\x80
稍微正确一些。反斜杠在字符串中自动转义。在单引号字符串中也是如此,尽管它实际上与此无关
但是,在双引号字符串中,仅使用
\x80
将由PHP进行解释,而\\x80
将由正则表达式引擎进行查看和解释。好的,到目前为止给出的所有答案都引导了我正确的方向,并允许我在
在\x之后,最多读取两个十六进制数字(字母可以是
大写或小写)。在UTF-8模式下,允许使用\x{…},其中
大括号的内容是一个十六进制数字字符串。它是
解释为UTF-8字符,其代码是给定的
十六进制数。原始十六进制转义序列,\xhh,
如果值大于127,则匹配两字节UTF-8字符
因此,作为总结:-
i) “\x”允许十六进制转义序列,在此序列之后,最多可读取两个十六进制数字
ii)“\xhh”两个“hh”字母可以是大写或小写
iii)“\xhh”指定范围为0-FF的代码点
iv)“\x80-\xFF”是指ASCII以外的字符范围,ASCII字符的UTF-8字节序列为1字节,类似于
0xxxxxxx
,因此它与\x00-\x7f
匹配
如果一个字符不是ASCII,则表示它有多个字节,在这种情况下,字节将用前导1
表的一部分来自
因此
\x80-\xff
匹配多字节字符中的1xxxxxx
字节,因此基本上是非ASCII字符。感谢您花时间回答。我理解你回答的第一部分。但是“但是,在双引号字符串中,仅使用\x80将由PHP解释,而\\x80将由正则表达式引擎查看和解释。”。。。我迷路了。此外,双反斜杠不应该结束于反斜杠本身,迫使它被视为一个单独的字符。。。让x80和xFF单独处理而不使用任何反斜杠?在重新阅读答案后,我还想问没有任何反斜杠的“| x80-xFF | I”是否是与上述意思相同的有效语法。不,它不会。阅读有关反斜杠的内容。
num of bytes
1 0xxxxxxx
2 110xxxxx 10xxxxxx
3 1110xxxx 10xxxxxx 10xxxxxx
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx