我终于开始理解转义十六进制字符(例如\x80
)背后的上下文。文档讨论了escape sequences,但我也可以看到一些正则表达式使用双反斜杠,例如\\x80 - \\xFF
。
使用preg_replace之类的内容时\\x80 - \\xFF
和\x80 - \xFF
之间的区别是什么?
答案 0 :(得分:1)
当使用preg_
函数时,您的字符串将被解析两次 - 首先是php编译器,然后是PCRE引擎。所以,如果你有,例如:
preg_match("/\x80/"....)
编译器将其转换为
preg_match("/�/"....) // let � be chr(80)
并将此传递给PCRE。当你有两个斜杠时:
preg_match("/\\x80/"....)
编译器将字符串转换为
preg_match("/\x80/"....)
然后它是PCRE引擎,将其转换为文字字符�
。
在这种特殊情况下,它并没有什么不同,但请考虑:
preg_match("/\x5B/"....)
编译后
preg_match("/[/"....)
由于悬空元字符[
,和PCRE失败了。现在,如果你逃避斜线
preg_match("/\\x5B/"....)
它被编译为
preg_match("/\x5B/"....)
让PCRE感到高兴,因为它理解[
应该按字面意思理解。
php如何编译你的字符串取决于你使用的引号:double / single / heredocs / nowdocs。有关详细信息,请参阅docs。一个简单的经验法则是尽可能使用单引号,如果必须使用双精度(用于变量插值),则将所有内容都转义两次,即使技术上不需要(例如"\\b$word\\b"
)。
答案 1 :(得分:0)
要编写十六进制x80
,您可以使用\
,这样就可以获得\x80
。
现在在PHP字符串\
中转义特殊字符。在字符串"$var"
中,PHP将尝试在该字符串中插入变量$var
(因为字符串使用"
。要转义$
,您编写"\$var"
并输出将只是简单的字符串$var
。
现在要在字符串中编写\
(无论是使用"
还是'
),您都使用相同的转义字符\
。因此输出\\
变为\
。
如果你写"\x80"
,你的输出将是"x80"
(没有\
)。比你用另一个\
=>转义\
"\\x80"
输出"\x80"
。
总结一切:
\x80
是十六进制字符,当您在字符串中写入时,您编写\\x80
。
只是一些乐趣:
PHP输出js函数以提醒\x80
:
echo "function alertHex(){
alert('\\\\x80 - \\\\xFF');
}";
为什么4 x \
?首先,您将PHP字符串转义为获取alert('\\x80 - \\xFF')
,以便将JS字符串转义为\x80 - \xFF
与preg_replace
相同:允许的符号:\
,$
,a-z
,[
,]
:patern:\\\$[a-z]\[\]
; preg_replace('\\\\\$[a-z]\\[\\]', '', $str);