Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 双转义十六进制字符ie\\x80-\\xFF_Php_Regex - Fatal编程技术网

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:没问题,很高兴听到它有帮助!事实上,重读你的答案似乎让我对这个问题有了更多的了解。因此,我被迫回到你的答案上来。干杯。谢谢你的时间和努力。它帮助我找到了最终的答案。