双转义十六进制字符,即\\ x80 - \\ xFF

时间:2014-09-23 06:43:31

标签: php regex

我终于开始理解转义十六进制字符(例如\x80)背后的上下文。文档讨论了escape sequences,但我也可以看到一些正则表达式使用双反斜杠,例如\\x80 - \\xFF

使用preg_replace之类的内容时\\x80 - \\xFF\x80 - \xFF之间的区别是什么?

2 个答案:

答案 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 - \xFFpreg_replace相同:允许的符号:\$a-z[]:patern:\\\$[a-z]\[\]; preg_replace('\\\\\$[a-z]\\[\\]', '', $str);