regex 80-FF是什么意思?

7gyucuyw  于 2023-10-22  发布在  其他
关注(0)|答案(5)|浏览(145)

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

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

现在,我认为它基本上是试图删除除上述字符以外的任何东西。但是\\x80-\\xff不是指某种形式的不可打印的asphalt字符吗?如果是这样的话,为什么代码可能会试图不删除它们?
任何指示/指针/帮助将不胜感激。谢谢.

q3aa0525

q3aa05251#

好的,到目前为止给出的所有答案都引导我朝着正确的方向前进,并允许我在documentation中找到以下内容。
在\x之后,最多读取两个十六进制数字(字母可以是大写或小写)。在UTF-8模式下,允许使用\x{...},其中大括号的内容是十六进制数字的字符串。它被解释为UTF-8字符,其代码是给定的十六进制数。如果值大于127,则原始十六进制转义序列\xhh匹配双字节UTF-8字符。
所以,作为总结:
i)'\x'允许十六进制转义序列,之后最多读取两个十六进制数字
ii)'\xhh'两个'hh'字母可以是大写或小写
iii)'\xhh'指定0-FF范围内的代码点
iv)“\x80-\xFF”指ASCII以外的字符范围

mfpqipee

mfpqipee2#

x80-xFF是非ASCII字符范围。它们仍然是可打印的,无论是拉丁语1,还是编码为UTF-8的更高代码点。
使用\\x80而不是\x80稍微正确一些。反斜杠在字符串中转义自身。在单引号字符串中也是如此,尽管它实际上是不相关的。
但是,在双引号字符串中,只使用\x80将被PHP解释,而\\x80将被正则表达式引擎看到并解释。

cqoc49vn

cqoc49vn3#

你不需要在PHP的模式中使用双反斜杠,但是即使你使用它,它也会被忽略并被当作转义符(就像简单的反斜杠)。
有一个例外,如果您使用heredoc或nowdoc语法来包含模式,则双反斜杠将被视为文字反斜杠。

m3eecexj

m3eecexj4#

ASCII字符的UTF-8字节序列是1个字节,如0xxxxxxx,因此它匹配\x00-\x7f
如果一个字符不是ASCII,意味着它有一个以上的字节,在这种情况下,字节将以1开头描述
维基百科上的部分表格

num of bytes
    1           0xxxxxxx
    2           110xxxxx    10xxxxxx    
    3           1110xxxx    10xxxxxx    10xxxxxx    
    4           11110xxx    10xxxxxx    10xxxxxx    10xxxxxx

所以\x80-\xff匹配多字节字符中的1xxxxxxx字节,所以基本上是非ASCII字符。

pvabu6sv

pvabu6sv5#

这是正确答案。x80 - xFF不是Unicode码位,而是字节。从10000000到1111111之间的任何值,包括多字节字符。但我不确定这是不是一个好名字🥦。^^

相关问题