php取代组的双反斜杠

时间:2015-11-02 10:56:51

标签: php regex

如何将字符串中的双反斜杠组替换为*

例如:

\\\\a ->  **a
\\\a  ->  *\a
\\a   ->  *a
\a    ->  \a

我尝试同时使用str_replacepreg_replace,但在第二种情况下失败了

str_replace('\\', '*', $str);
preg_replace('/\\\\/', '*', $str);

=> `\\\a` -> `**a`

我想要这样做的原因是我想要与Split string by delimiter, but not if it is escaped相同但

$str = '1|2\|2|3\\|4\\\|4';
$r   = preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $str);
var_dump($r);

给我。

  0 => string '1' (length=1)
  1 => string '2\|2' (length=4)
  2 => string '3\|4\\' (length=6)
  3 => string '4' (length=1)

我期待像

这样的东西
  [0] => 1
  [1] => 2\|2
  [2] => 3\\
  [3] => 4\\\|4

php 5.4.45-2

1 个答案:

答案 0 :(得分:3)

PHP单引号字符串中的文字反斜杠必须使用2个反斜杠声明:要打印1|2\|2|3\\|4\\\|4,您需要$str = '1|2\\|2|3\\\\|4\\\\\\|4';

在正则表达式中,字面反斜杠可以与4个反斜杠匹配。

以下是更新的PHP code

$str = '1|2\\|2|3\\\\|4\\\\\\|4';
// echo $str . PHP_EOL; => 1|2\|2|3\\|4\\\|4
$r   = preg_split('~\\\\.(*SKIP)(*FAIL)|\\|~s', $str);
var_dump($r);

结果:

array(4) {
  [0]=>
  string(1) "1"
  [1]=>
  string(4) "2\|2"
  [2]=>
  string(3) "3\\"
  [3]=>
  string(6) "4\\\|4"
}

要从**a获取\\a,您可以使用

$str = '\\\\a';
$r   = preg_replace('~\\\\~s', '*', $str);

请参阅another demo