функция sprintf не оценивает - PullRequest
1 голос
/ 27 июля 2011

Я пытаюсь удалить не RFC символы после фильтрации URL-адреса другими методами.Этот метод ломается:

$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 ]

3 голосов
/ 27 июля 2011

Поскольку $1 заполняется уже из-за переменной интерполяции, и, таким образом, вы пытаетесь вызвать ord(~) вместо ord("~"). Используйте "$1" вместо $1.

$query = preg_replace('/([^a-zA-Z0-9._-])/e', 'sprintf("_-%2.2x", ord("$1"))', $query);
2 голосов
/ 27 июля 2011

Ключ ord(~). Буква, переданная в ord, должна быть заключена в кавычки.

1 голос
/ 27 июля 2011

Это должно быть 'sprintf("_-%2.2x", ord("$1"))', обратите внимание на двойные кавычки вокруг $1.

...