2011-07-26 9 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です。

関連する問題