Php 正则表达式正好将2个反斜杠替换为3

Php 正则表达式正好将2个反斜杠替换为3,php,regex,Php,Regex,我有一个字符串,其中2个反斜杠必须变成3个反斜杠。所有的反斜杠都跑掉了,我做不到,什么都没用 例如: aaaaa\\aaaaa必须变成aaaaa\\\aaaaa aaaaa\\\aaaaa保持aaaaa\\\aaaaa(一行中不得检测到2个反斜杠) 我管理了这个,它在regex101.com中运行: (\\\\)([^\\]) 因此,在php中,它将是: preg_replace('/(\\\\)([^\\])/', '\\\$2', $bob); 但是php给了我这个错误信息: pre

我有一个字符串,其中2个反斜杠必须变成3个反斜杠。所有的反斜杠都跑掉了,我做不到,什么都没用

例如:

  • aaaaa\\aaaaa
    必须变成
    aaaaa\\\aaaaa
  • aaaaa\\\aaaaa
    保持
    aaaaa\\\aaaaa
    (一行中不得检测到2个反斜杠)
我管理了这个,它在regex101.com中运行:

(\\\\)([^\\])
因此,在php中,它将是:

preg_replace('/(\\\\)([^\\])/', '\\\$2', $bob);
但是php给了我这个错误信息:

preg_replace(): Compilation failed: missing terminating ] for character class at offset 10
所以我不知道这是否是PHP的一个bug,但我需要另一种方法来实现这一点,我在google上找不到解决方案。

试试这个正则表达式:

(?<!\x5C)\x5C{2}(?!\x5C)

您可能希望利用以下优势:


preg_quote
通常用于长度超过一个字符的变量,因此在这里可能被视为过度使用。您可以定义
$q='\\\\',而不是使用它(两个字符串转义的反斜杠),这将获得相同的结果。

除了在正则表达式中转义外,您是否也在PHP字符串中转义?顺便提一下,您可以使用
$2
替换,而不必在替换中包含
(?仅捕获两个反斜杠字符并替换为“\\”(或者,谢谢你的评论Adrian。是的,我也在用PHP字符串转义,或者更确切地说,是编码函数在转义。总之,现在一切都好了!你需要用括号括住
\\{2}
捕获反斜杠以使替换生效。@AdrianWragg最后,我选择使用ASCII码。哇,这是一个我不知道的严重魔法,感谢heaps!!我使用了另一种解决方案,但也感谢你的回答,我不知道preg_quote,将来还会使用它!@naturalborncaper没问题,很高兴您已经对它进行了排序。
preg_quote
在您不确切知道变量将包含什么的情况下特别有用。我在这里使用它,因为它意味着您不需要跳过太多的障碍。
define('THREE_SLASHES', preg_quote('\\\\\\'));
define('RE_TWO_SLASHES_ONLY', '~(?<!\x5c)\x5c{2}(?!\x5c)~');

$test='aaaaa\\\\aaaaa';
echo preg_replace(RE_TWO_SLASHES_ONLY, THREE_SLASHES, $test) . '<br>';

$test='aaaaa\\\\\\aaaaa';
echo preg_replace(RE_TWO_SLASHES_ONLY, THREE_SLASHES, $test) . '<br>';
aaaaa\\\aaaaa
aaaaa\\\aaaaa
$in1 = <<<'EOD'
aaaaa\\aaaaa
EOD;
$in2 = <<<'EOD'
aaaaa\\\aaaaa
EOD;

echo "input 1: $in1";
echo "input 2: $in2";

$q = preg_quote('\\','/');

echo "output 1: " . preg_replace("/(?<!$q)$q$q(?!$q)/", "$q$q$q", $in1);
echo "output 2: " . preg_replace("/(?<!$q)$q$q(?!$q)/", "$q$q$q", $in2);
input 1: aaaaa\\aaaaa
input 2: aaaaa\\\aaaaa
output 1: aaaaa\\\aaaaa
output 2: aaaaa\\\aaaaa