Php 双转义十六进制字符ie\\x80-\\xFF
我终于开始理解转义十六进制字符(如Php 双转义十六进制字符ie\\x80-\\xFF,php,regex,Php,Regex,我终于开始理解转义十六进制字符(如\x80)背后的上下文。文档中谈到了,但我也看到一些正则表达式使用了双反斜杠,例如\\x80-\\xFF 当使用preg\u replace之类的东西时,\\x80-\\xFF和\x80-\xFF之间有什么区别?当使用preg\u函数时,字符串会被解析两次-首先由php编译器解析,然后由PCRE引擎解析。因此,如果您有,例如: preg_match("/\x80/"....) 编译器将其转换为 preg_match("/�/"....) // let � be
\x80
)背后的上下文。文档中谈到了,但我也看到一些正则表达式使用了双反斜杠,例如\\x80-\\xFF
当使用preg\u replace之类的东西时,
\\x80-\\xFF
和\x80-\xFF
之间有什么区别?当使用preg\u
函数时,字符串会被解析两次-首先由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/herdocs/nowdocs。有关详细信息,请参阅。一个简单的经验法则是,如果必须使用double(用于变量插值),则即使技术上不需要,也要对所有内容进行两次转义(例如“\\b$word\\b”
).要编写十六进制x80
,您可以使用\
,这样您就可以得到\x80
现在在PHP中,字符串\
转义特殊字符。在字符串“$var”
中,PHP将尝试在该字符串中插入变量$var
(因为字符串使用”
。要转义$
,您需要编写“\$var”
,输出将只是简单的字符串$var
。
现在要以字符串形式编写\
(无论它使用“
还是”
),您都使用相同的转义字符\
。因此,输出\
将变成\
如果你写“\x80”
,你的输出将是“x80”
(没有\
)。然后你用另一个\
=>“\\x80”
输出“\x80”
所以总结一下:
\x80
是十六进制字符,当您在字符串中写入它时,您将写入\\x80
只是一些乐趣:
输出js函数以发出警报的PHP\x80
:
echo "function alertHex(){
alert('\\\\x80 - \\\\xFF');
}";
为什么使用4 x\
?首先,您要转义PHP字符串以获取警报('\\x80-\\xFF')
,即转义JS字符串以获取\x80-\xFF
与preg\u replace
相同:允许的符号:\
,a-z
,[
,]
:patern:\\\$[a-z]\[\]
,preg\u replace('\\\\\\\\\\\[a-z]\[\\]',''.$str)
,这还取决于您是使用还是>
。这个解释当然对我有帮助。我希望我能接受不止一个“解决方案”,但我不能……所以我必须“接受”上一个答案同样有帮助。无论如何,我很感激。@Threative:没问题,很高兴听到它有帮助!事实上,重读你的答案似乎让我对这个问题有了更多的了解。因此,我被迫回到你的答案上来。干杯。谢谢你的时间和努力。它帮助我找到了最终的答案。