2015-01-21 79 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