我有一个字符串,其中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的错误,但我需要另一种方法来做到这一点,我无法在谷歌上找到解决方案。
答案 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