在对这个奇妙问题的最高投票答案中,在调用中使用以下正则表达式(来自答案的函数):preg_replaceauto_version
'{\\.([^./]+)$}'
Run Code Online (Sandbox Code Playgroud)
此正则表达式的最终目标是从给定文件名中提取文件的扩展名.但是,我很困惑为什么这个正则表达式的开头有效.即:
为什么\\.匹配与\.正则表达式相同?
前者不应该匹配(a)一个字面反斜杠,其次是(b)任何字符,而第二个匹配一个字面时间吗?单引号字符串的规则表明\\产生文字反斜杠.
考虑这个简单的例子:
$regex1 = '{\.([^./]+)$}'; // Variant 1 (one backslash)
$regex2 = '{\\.([^./]+)$}'; // Variant 2 (two backslashes)
$subject1 = '/css/foobar.css'; // Regular path
$subject2 = '/css/foobar\\.css'; // Literal backslash before period
echo "<pre>\n";
echo "Subject 1: $subject1\n";
echo "Subject 2: $subject2\n\n";
echo "Regex 1: $regex1\n";
echo "Regex 2: $regex2\n\n";
// Test Variant 1
echo preg_replace($regex1, "-test.\$1", $subject1) . "\n";
echo preg_replace($regex1, "-test.\$1", $subject2) . "\n\n";
// Test Variant 2
echo preg_replace($regex2, "-test.\$1", $subject1) . "\n";
echo preg_replace($regex2, "-test.\$1", $subject2) . "\n\n";
echo "</pre>\n";
Run Code Online (Sandbox Code Playgroud)
输出是:
Subject 1: /css/foobar.css
Subject 2: /css/foobar\.css
Regex 1: {\.([^./]+)$} <-- Output matches regex 2
Regex 2: {\.([^./]+)$} <-- Output matches regex 1
/css/foobar-test.css
/css/foobar\-test.css
/css/foobar-test.css
/css/foobar\-test.css
Run Code Online (Sandbox Code Playgroud)
长话短说:为什么\\.在preg_replace通话中会产生相同的匹配结果\.?