我有一個字符串,它看起來像這樣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