2015-01-21 31 views
2

我有一个字符串,它看起来像这样PHP preg_replace模式似乎只有工作,如果它的错误?

../Clean_Smarty_Projekt/tpl/templates_c\. 
../Clean_Smarty_Projekt/tpl/templates_c\.. 

我想用一个regulare表达式替换../\.\..

之前,我这样做是这样的:

$result = str_replace(array("../","\..","\."),"",$str); 

它就在那里(模式)必须是在这个订单,因为改变会令输出一个小马车。所以我决定使用正则表达式。

现在我来到了这个模式

$result = preg_replace('/(\.\.\/)|(\\[\.]{1,2})/',"",$str); 

什么实际只返回空字符串...

原因:(\\[\.]{1,2})

Regex101其一切ok。 (花了我几分钟的时间才意识到我不需要preg_replace中的/g

如果我在preg_replace中使用此模式,我必须执行(\\\\[\.]{1,2})才能使其工作。但这显然是错误的,因为我没有搜索两个斜线。

当然我知道逃逸的rulse(逃逸斜杠)。

为什么这不匹配?

+0

是,这个工程太,但居然连3条斜线,因为斜线转义和follwed焦炭没有逃逸是错误的.... 3个斜线意味着我逃避'[ '以及。对我来说看起来像一个bug。 – Dwza 2015-01-21 12:02:06

+0

@Dwza使用4个反斜杠来匹配一个反斜杠并不是“明显错误”。事实上,这是正确的。当php解析器得到4个反斜杠时,它将解释为2个反斜杠。然后PHP将它传递给正则表达式引擎(2个反斜杠),它被解释为1个反斜杠。注意:不需要在字符类“[。]”中跳过点:它在其内部丢失了正则表达式的含义。 – HamZa 2015-01-21 12:06:51

+1

@HamZa phuu ..好像在玩“中国耳语”:D thx为了这个解释。 – Dwza 2015-01-21 12:09:03

回答

2

我建议你使用不同的php分隔符。在/分隔符内,需要使用三个\\\或四个\\\\反斜杠来匹配单个反斜杠。

$string = '../Clean_Smarty_Projekt/tpl/templates_c\.'."\n".'../Clean_Smarty_Projekt/tpl/templates_c\..'; 
echo preg_replace('~\.\./|\\\.{1,2}~', '', $string) 

输出:

Clean_Smarty_Projekt/tpl/templates_c 
Clean_Smarty_Projekt/tpl/templates_c 
+1

你爱那些'〜'那些定界符不是你的:D? (我已经看到它,当你改变你的名字时:'〜Avinash Raj〜') – Rizier123 2015-01-21 12:05:22

+0

这个接缝现在可以正常工作。非常感谢你^^我认为我必须将点设置为[]才能使{1,2}工作...... – Dwza 2015-01-21 12:05:59

+0

最好将两个匹配组合起来,因为您的'|'不明确,所以你的模式将取代_“../ ..”_作为一个匹配(_“..”_ +'[/ \ /]'< - 或应用于单个字符,然后_“.. “_文字也是)。这可能是一个像_“foo .. \ ../ bar”_这样的字符串中的问题,它不会像预期的那样行事 – 2015-01-21 12:06:39