我有一个字符串,它看起来像这样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(逃逸斜杠)。
为什么这不匹配?
是,这个工程太,但居然连3条斜线,因为斜线转义和follwed焦炭没有逃逸是错误的.... 3个斜线意味着我逃避'[ '以及。对我来说看起来像一个bug。 – Dwza 2015-01-21 12:02:06
@Dwza使用4个反斜杠来匹配一个反斜杠并不是“明显错误”。事实上,这是正确的。当php解析器得到4个反斜杠时,它将解释为2个反斜杠。然后PHP将它传递给正则表达式引擎(2个反斜杠),它被解释为1个反斜杠。注意:不需要在字符类“[。]”中跳过点:它在其内部丢失了正则表达式的含义。 – HamZa 2015-01-21 12:06:51
@HamZa phuu ..好像在玩“中国耳语”:D thx为了这个解释。 – Dwza 2015-01-21 12:09:03