[英]PHP - How to replace single backslashes that precede numbers with double backslashes
[英]Regex replace exactly 2 backslashes by 3
我有一個字符串,其中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的錯誤,但是我需要另一種方法來執行此操作,因此無法在Google上找到解決方案。
您可能想在這里利用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
。
正則表達式使用負的lookbehind (?<!$q)
和負的lookahead (?!$q)
來確保中間的兩個斜杠不在斜杠的前面或后面。
輸出:
input 1: aaaaa\\aaaaa
input 2: aaaaa\\\aaaaa
output 1: aaaaa\\\aaaaa
output 2: aaaaa\\\aaaaa
preg_quote
通常用於長度超過一個字符的變量,因此在這里可能被視為過大。 您可以定義$q = '\\\\\\\\';
而不是使用它$q = '\\\\\\\\';
(兩個字符串轉義的反斜杠),將獲得相同的結果。
試試這個正則表達式:
(?<!\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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.