2011-07-26 145 views
1

我想用其他方法過濾URL後刪除非RFC字符。這種方法打破:sprintf函數沒有評估

$query = 'www.example.com_-.su_-.1Mk8ij_-.www.cs.cmu.edu_-.~mjw_-.recipes_-.cheese_-.cheese-garlic-biscuits.html'; 

$query = preg_replace('/([^a-zA-Z0-9._-])/e', 'sprintf("_-%2.2x", ord($1))', $query); 

返回的錯誤是

Failed evaluating code: \nsprintf("_-%2.2x", ord(~))

它打破了其他的例子還有,我想不通爲什麼。任何人都可以將我指向正確的方向嗎?

+0

你嘗試過報價了嗎? –

回答

3

由於$1由於可變插值而已被填充,因此您試圖撥打ord(~)而不是ord("~")。使用"$1"而不是$1

$query = preg_replace('/([^a-zA-Z0-9._-])/e', 'sprintf("_-%2.2x", ord("$1"))', $query); 
+0

如果'$ 1'包含'''? – Qtax

+0

這就是'/ e'的弱點。 – Amber

+1

哇,它的工作原理還在:http://ideone.com/xA9v6(PHP的醜陋永遠不會讓人驚歎我)。 – Qtax

2

線索是ord(~)。應該引用傳遞給ord的文字。

1

它應該是'sprintf("_-%2.2x", ord("$1"))',請注意圍繞$1的雙引號。