去除重复斜杠的正则表达式

3

你好吗?我有一个任务。我有很多可能包含重复斜杠的字符串。我需要将重复的斜杠替换为一个斜杠(任意数量的斜杠),但是当斜杠后面找到下一个符号(引号,双引号,NUL(空字节))时 - 所有斜杠都应该被删除。谢谢。我的编程语言是PHP。以下是一些测试:

$s1 = 'test\\\\string';
// test\string
$s2 = 'test\\\\\"\\\\\'\\\\string';
// test"'\string
$s3 = 'test\\string\\\\\"';
// test\string"
5个回答

5

使用

preg_replace("~\\\\+([\"\'\\x00\\\\])~", "$1", $string);

将任意数量的\替换为一个\

该模式由任意数量的初始反斜杠\\\\+和后面跟随的一个符号组成,这个符号是 "'\x00\中的一个。替换将有效地删除任何前面的反斜杠。

在正则表达式中需要4个反斜杠。两个反斜杠(\\)会导致正则表达式字符串中只有一个反斜杠(\),因为PHP解释器使用反斜杠来转义特殊字符,如"\。出于同样的原因,在正则表达式中你将需要两个反斜杠。

或者换句话说: 要获得\+作为正则表达式,你必须添加一个反斜杠,告诉PCRE这个反斜杠不是用来转义+的。要将\\+作为字符串获取,你还需要在每个反斜杠前添加一个反斜杠,以告诉PHP解释器你不想用第一个反斜杠来转义第二个反斜杠。

源代码:\\\\+

在正则表达式字符串中:\\+

模式匹配:\+


谢谢。它有效。你也可以看到我的答案使用了str_replace。 - Alex Pliutau

2

另一种方式。

$s = 't\est\\\\\\\\\\\\stri\\\\\"\\\\\'\\\\0\\\\ng';
$s = preg_replace('~\\\\+~', '\\', $s);
$s = str_replace(array('\\"', '\\\'', '\\0'), array('"', '\'', "\0"), $s);

str_replace 可以进行多个替换,因此您也可以替换多个反斜杠。我无法使用 str_replace 让它正常工作,但如果您愿意,可以尝试一下。 :-) - Basti

2

将2个或多个连续的斜杠替换为单个斜杠

preg_replace('/\\\\+/','\\',$str);

为了替换斜杠: preg_replace('/\/\/+/', '/', $string); - KTB

1

试试这些:

preg_replace("/\\+(['\"\0\\])/", "$1", $string);

0

stripslashes有什么问题吗?它考虑了转义“特殊”字符的斜杠并删除了“额外”的斜杠。


  1. 我可以有很多斜杠,需要在循环中运行stripslashes。
  2. stripslashes将\a转换为a。这是不正确的。
- Alex Pliutau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接