php替换双反斜杠组

标签 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

最佳答案

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

关于php替换双反斜杠组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33475993/

相关文章:

php - Bootstrap typeahead - 小节(标题)

php - 将 mySQL 结果显示为水平图 block

正则表达式匹配 SQL 脚本 SSMS 中的最后一个方括号

php - 捕获无条件结束的字符串

java - Apache Camel 文件组件 : Specifying 1 file in regex

php - mysql 查询中的 $_SESSION 变量?

php mysql 信息检索

php - 按日期捆绑信息

java - 在正则表达式中重用子模式

regex - 有空间还是没有空间