正则表达式正好用2替换2个反斜杠

时间:2014-05-23 08:30:10

标签: php regex

我有一个字符串,其中2个反斜杠必须变为3个反斜杠。随着所有的反斜杠逃脱,我无法做到,没有任何工作。

例如:

  • aaaaa\\aaaaa必须成为aaaaa\\\aaaaa
  • aaaaa\\\aaaaa STAYS aaaaa\\\aaaaa(不得检测到连续2个反斜杠)

我管理了这个,在regex101.com上运行:

(\\\\)([^\\])

所以在php中,它将是:

preg_replace('/(\\\\)([^\\])/', '\\\$2', $bob);

但是php给了我这个错误信息:

preg_replace(): Compilation failed: missing terminating ] for character class at offset 10

所以我不知道它是否是PHP的错误,但我需要另一种方法来做到这一点,我无法在谷歌上找到解决方案。

2 个答案:

答案 0 :(得分:2)

您可能希望在此处利用preg_quote

$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);

我使用nowdoc(自PHP 5.3.0起可用)来定义输入字符串,以便可以看到它的外观。在nowdoc内部没有解析。

$q现在是一个转义的单反斜杠,可以在preg_replace之前的任何地方使用文字\

正则表达式使用负向后看(?<!$q)和否定前瞻(?!$q)来确保中间的两个斜杠不在斜杠之前或之后。

输出:

input 1: aaaaa\\aaaaa
input 2: aaaaa\\\aaaaa
output 1: aaaaa\\\aaaaa
output 2: aaaaa\\\aaaaa

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

答案 1 :(得分:1)

试试这个正则表达式:

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

反斜杠可能是一个真正的噩梦。最好在正则表达式中使用反斜杠的ASCII码。

示例代码:

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