我正在尝试用PHP学习正则表达式并且现在停留在这里。我的问题看似愚蠢,但请解释一下
我通过了一个链接:
Extra backslash needed in PHP regexp pattern
但我无法理解:
在回答中他提到了两个陈述:
2个反斜杠用于字符串中的转义("\\\\"
- > \\
)
1个反斜杠用于在正则表达式引擎中进行转义(\\
- > \
)
我的问题:
“unescaping”这个词实际上意味着什么? unescaping的目的是什么?
为什么我们需要4个反斜杠才能将它包含在正则表达式中?
答案 0 :(得分:3)
反斜杠在regexen 和 PHP中都有特殊含义。在这两种情况下,它都用作转义字符。例如,如果要在PHP字符串文字中编写文字引号字符,则不起作用:
$str = ''';
PHP会“混淆”,'
结束字符串,哪些是字符串的一部分。这就是\
的来源:
$str = '\'';
它转义 '
的特殊含义,因此它不是终止字符串文字,而是现在只是字符串中的普通字符。还有更多的转义序列,如\n
。
现在这意味着\
是一个具有特殊含义的特殊字符。要想要编写文字\
时要逃避这个难题,你必须将文字反斜杠转义为\\
:
$str = '\\'; // string literal representing one backslash
这在PHP和regexen中都是一样的。如果要在正则表达式中编写文字反斜杠,则必须编写/\\/
。现在,既然你把你的regexen写成PHP字符串,你需要双重转义:
$regex = '/\\\\/';
PHP字符串转义机制首先将一对\\
简化为一个\
,因此实际的正则表达式是/\\/
,这是一个正则表达式,意思是“一个反斜杠”。
答案 1 :(得分:0)
我认为你可以使用“preg_quote()”:
此函数可以转义特殊字符,因此您可以按原样提供输入,而不必自行转义:
<?php
$string = "online 24/7. Only for \o/";
$escaped_string = preg_quote($string, "/"); // 2nd param is optional and used if you want to escape also the delimiter of your regex
echo $escaped_string; // $escaped_string: "online 24\/7. Only for \\o\/"
?>