如果没有后跟n,如何替换所有出现的\?

时间:2016-12-16 17:08:09

标签: php regex preg-replace

似乎是一个相对简单的任务,让我陷入一个PHP应用程序。我有一个字符串,里面有一堆\n。这些都很好,需要留在那里。但是,还有一次出现的字符\和我需要替换或移除的字符,让我们只说空字符而不删除n后面的字符。

我想出的最好的方法是首先用其他东西替换所有\n,一些奇怪的字符,然后用空格替换剩余的\,然后将奇怪的字符转换回{{1 }}。然而,这似乎是浪费时间和资源,此外,没有什么能保证我会发现在字符串的其余部分中永远不会遇到的奇怪的角色......

任何提示?

2 个答案:

答案 0 :(得分:3)

你需要

$s = preg_replace('~\\\\(?!n)~', '', $s);

请参阅PHP demo

$s = '\\n \\t \\';
$s = preg_replace('~\\\\(?!n)~', '', $s);
echo $s; // => \n t 

我们需要4个反斜杠将2个字面反斜杠传递给正则表达式引擎,以匹配输入字符串中的1个字面反斜杠。 (?!n)是一个否定前瞻,它会使n后面的反斜杠的所有匹配失败。

答案 1 :(得分:1)

您应该可以使用负前瞻断言来执行此操作:

\\(?!n)

\\查找反斜杠,(?!n)断言下一个字符不是n,但与字符不匹配。

在PHP中使用它:

$text = 'foo\nbar\nb\az\n';
$newtext = preg_replace('/\\\\(?!n)/', '', $text);

详细信息:https://regex101.com/r/F2qhAP/1