sprintf函数没有评估

时间:2011-07-26 23:48:22

标签: php regex preg-replace printf

我正在尝试使用其他方法过滤网址后删除非RFC字符。这种方法打破了:

$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(~))

它打破了其他例子,我无法弄清楚原因。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:3)

由于变量插值导致$1已经填满,因此您尝试拨打ord(~)而不是ord("~")。使用"$1"代替$1

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

答案 1 :(得分:2)

线索是ord(~)。应引用传递给ord的文字。

答案 2 :(得分:1)

应为'sprintf("_-%2.2x", ord("$1"))',注意$1附近的双引号。