PHP preg_replace反斜杠

时间:2012-10-19 20:18:00

标签: php regex

我的字符串中有双反斜杠'\',需要将其转换为单个反斜杠'\'。我已经尝试了几种组合,当我使用echo或更多的反斜杠被意外地添加到字符串时,整个字符串消失了。这个正则表达式让我变得疯狂......哈哈......

我在其他失败的尝试中试过这个:

$pattern = '[\\]';
$replacement = '/\/';

?>
<td width="100%">&nbsp;<?php echo preg_replace($pattern, $replacement,$q[$i]);?></td>

如果这是一个愚蠢的问题我很抱歉,我很感激任何指示。

6 个答案:

答案 0 :(得分:7)

使用stripslashes() - 它完全符合您的要求。

<td width="100%">&nbsp;<?php echo stripslashes($q[$i]);?></td>

答案 1 :(得分:2)

使用stripslashes代替。此外,在正则表达式中,您正在搜索单个反斜杠,并且您的替换是不正确的。 \\{2}应该搜索双反斜杠,而\应该用单个替换它们,尽管我没有对此进行测试。

进一步解释,模式[\\]匹配由单个反斜杠组成的集合中的任何字符。在php中,您还应该使用正斜杠来划分正则表达式:/[\\]/

您的替换(无分隔符)\不是用于匹配单个反斜杠的正则表达式。匹配单个反斜杠的正则表达式为\\。注意逃避。这就是说,替换术语必须是一个字符串,而不是一个正则表达式(反向引用除外)。

编辑:Sven在下面声称,stripslashes删除所有反斜杠。这根本不是真的,我将在下面解释原因。

如果一个字符串包含2个反斜杠,则第一个反斜杠将被视为转义反斜杠并将被删除。这可以在http://www.phpfiddle.org/main/code/3yn-2ut看到。任何反斜杠本身都存在的事实与striplashes删除所有反斜杠的说法相矛盾。

为了澄清,这个字符串声明无效:$x = "\";,因为反斜杠会转义第二个引号。此字符串"\\"包含一个反斜杠。在取消引用此字符串的过程中,将删除此反斜杠。此"\\\\"字符串包含两个反斜杠。在取消引用时,第一个将被视为逃避反斜杠,并将被删除。

答案 2 :(得分:2)

使用preg_replace将双反斜杠转换为单反斜杠:

preg_replace('/\\\\{2}/', '\\', $str)
  • 第一个参数中的\需要转发两次,一次转发stringregex转一次,就像CodeAngry说的那样。
  • 在第二个参数中,string只会将其展开一次。

有意义吗?

答案 3 :(得分:1)

如果您要查找的字符串是常量,请不要使用正则表达式,就像“每个双反斜杠的实例”一样。

使用str_replace()执行此任务。这是一个非常简单的函数,用一个字符串替换另一个字符串。

在您的情况下:str_replace('\\\\', '\\', $var)

双反斜杠实际上转换为四个反斜杠,因为在任何引号(单引号或双引号)中,单个反斜杠是后续字符的转义序列的开始。如果你想要一个字面反斜杠,你必须写两个。你想要两个反斜杠,你必须写下四个反斜杠。

我不喜欢stripslashes()的建议。这当然会将你的双反斜杠“解码”为一个反斜杠。但它也会删除整个字符串中的所有单个反斜杠。如果没有 - 罚款,否则现在就会失败。

答案 4 :(得分:0)

$pattern = '[\\]'; // wrong
$pattern = '[\\\\]'; // right
<\ n> \ t \ escape \ as \\和\ n \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

答案 5 :(得分:-2)

使用htmlentities函数将斜杠转换为html实体,然后使用str_replace或preg_match将其更改为新实体