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

我有一个字符串,其中2个反斜杠必须变为3个反斜杠。 随着所有反斜杠的转义,我无法做到并且没有任何工作。</ p>

例如:</ p>


  • aaaaa \ aaaaa </ code>必须成为 aaaaa \\ aaaaa </ code> </ li>
  • aaaaa \\ aaaaa </ code> STAYS aaaaa \ \ aaaaa </ code>(不得检测连续2个反斜杠)</ li>
    </ ul>

    我管理了这个,在regex101.com中有效:</ p> \ n

     (\\)([^ \])
    </ code> </ pre>

    所以在php中,它将是:</ p >

      preg_replace('/(\\)([^ \])/','\\ $ 2',$ bob); 
    </ code> </ pre>

    但是php给了我这个错误信息:</ p>

      preg_replace():编译失败:缺少终止]对于偏移量为10的字符类
    < / code> </ pre>

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

    </ div>

展开原文

原文

I have a string where 2 backslashes must become 3 backslashes. With all the escaping of backslashes, I can't do it and nothing's working.

For example:

  • aaaaa\\aaaaa must become aaaaa\\\aaaaa
  • aaaaa\\\aaaaa STAYS aaaaa\\\aaaaa (2 backslashes in a row must not be detected)

I managed this, which works in regex101.com:

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

so in php, it would be:

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

But php gives me this error message:

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

So I don't know if it's a bug of PHP, but I need another way of doing this and I can't find the solution on google.

dongsanhu4784
dongsanhu4784 感谢您的评论阿德里安。是的我也在PHP字符串中转义,或者更确切地说,编码函数正在执行它。无论如何,一切都很好!
大约 6 年之前 回复
dtny30176
dtny30176 顺便说一句,你可以简单地使用(?<!\\)(\\{2})(?!\\)来捕获两个反斜杠字符并替换为\\(或者,在
大约 6 年之前 回复
dongliuzi3410
dongliuzi3410 除了在正则表达式中转义外,您是否还在PHP字符串中转义?
大约 6 年之前 回复

2个回答



试试这个正则表达式:</ p>

 (?&lt;!\ x5C)\ x5C  {2}(?!\ x5C)
</ code> </ pre>

反斜杠在这里可能是一场真正的噩梦。 最好在正则表达式中使用反斜杠的ASCII码。</ p>

示例代码:</ strong> </ p>

   define('THREE_SLASHES',preg_quote('\\\')); 
define('RE_TWO_SLASHES_ONLY','〜(?&lt;!\ x5c)\ x5c {2}(?!\ x5c)〜') ;

$ test ='aaaaa \\ aaaaa';
echo preg_replace(RE_TWO_SLASHES_ONLY,THREE_SLASHES,$ test)。 '&lt; br&gt;';

$ test ='aaaaa \\\ aaaaa';
echo preg_replace(RE_TWO_SLASHES_ONLY,THREE_SLASHES,$ test)。 '&LT峰; br&GT;';
</代码> </ PRE>

<强>输出</强> </ p>

 <代码> AAAAA \\  aaaaa 
aaaaa \\ aaaaa
</ code> </ pre>
</ div>

展开原文

原文

Try this regex:

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

Backslashes can be a real nightmare here. It's better to use the ASCII code of the backslash right into the regex.

Sample code:

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>';

Output

aaaaa\\\aaaaa
aaaaa\\\aaaaa

dpxnrx11199
dpxnrx11199 哇,这是一些我不知道的严重魔法,谢谢堆!
大约 6 年之前 回复
dongyou6795
dongyou6795 最后,我选择使用ASCII码。
大约 6 年之前 回复
dongluo3962
dongluo3962 您需要在\\ {2}周围使用括号来捕获反斜杠的反斜杠才能工作。
大约 6 年之前 回复



您可能希望利用 preg_quote </ code> :</ p>

  $ in1 =&lt;&lt;&lt;&lt;  EOD'
aaaaa \ aaaaa
EOD;
$ in2 =&lt;&lt;&lt;'EOD'
aaaaa \\ aaaaa
EOD;

echo“输入1:$ in1”;
echo“输入2 :$ in2“;

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

echo”输出1:“。 preg_replace(“/(?&lt;!$ q)$ q $ q(?!$ q)/”,“$ q $ q $ q”,$ in1);
echo“output 2:”。 preg_replace(“/(?&lt;!$ q)$ q $ q(?!$ q)/”,“$ q $ q $ q”,$ in2);
</ code> </ pre>

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

$ q </ code>现在是一个转义的单反斜杠,可以在 preg_replace </ code>中的任何地方使用 以前使用文字 \ </ code>。</ p>

正则表达式使用负向lookbehind (?&lt;!$ q)</ code>和负向前瞻< 代码>(?!$ q)</ code>以确保中间的两个斜杠不在斜杠之前或之后。 </ p>

输出:</ p>

 输入1:aaaaa \ aaaaa 
input 2:aaaaa \\ aaaaa
output 1:aaaaa \ \ aaaaa
output 2:aaaaa \\ aaaaa
</ code> </ pre>

preg_quote </ code>通常用于长度超过一个字符的变量,因此可能会被看到 在这里太过分了。 您可以定义 $ q ='\\'; </ code>(两个字符串转义的反斜杠),而不是使用它,这将实现相同的结果。</ p>
</ div>

展开原文

原文

You might like to take advantage of preg_quote here:

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

I used a nowdoc (available since PHP 5.3.0) to define the input string so that it can be seen exactly as it looks. No parsing is done inside a nowdoc.

$q is now an escaped single backslash that can be used in preg_replace wherever you wanted to use a literal \ before.

The regular expression uses negative lookbehind (?<!$q) and negative lookahead (?!$q) to ensure that the two slashes in the middle aren't preceded or followed by a slash.

Output:

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

preg_quote is normally used for variables longer than one character, so might be seen as overkill here. Instead of using it, you could define $q = '\\\\'; (two string-escaped backslashes) and that would achieve the same outcome.

dongshimao7115
dongshimao7115 没问题,很高兴你把它整理好了。 当你不确切知道变量将包含什么时,preg_quote特别有用。 我只是在这里使用它,因为这意味着你不需要跳过这么多箍。
大约 6 年之前 回复
dongyuan9292
dongyuan9292 我使用了另一种解决方案,但也感谢你的回答,不知道preg_quote,并将在未来使用它!
大约 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐