PHP substr () не работает, когда 3-й параметр является строкой, подобной 0xe84? - PullRequest
0 голосов
/ 07 января 2011

У меня проблемы с использованием substr() со совпадениями, полученными из регулярного выражения (использование preg_match() - $a содержит массив совпадений).

Когда echo'ing a[1] равно0xe84 и является строкой (как я проверил, используя gettype()).

substr($file, $a[2], $a[1]); //not working...

Но если я это сделаю (Также обратите внимание, что я не могу сделать это, так как третий параметр являетсяgeneric, исходящий из регулярного выражения - это просто используется для иллюстрации моей проблемы):

substr($file, $a[2], 0xe84); //works fine - when entering the match directly as an integer

Поэтому мой вопрос заключается в том, почему substr() работает только тогда, когда 3-й параметр имеет целочисленный тип, икак я могу сделать $a[1] целым числом, чтобы оно работало нормально?

Я пробовал делать приведение типов (используя (int)), используя intval(), а также settype(integer) на $a[1], однако$a[1] затем становится 0substr() не будет работать).

Ответы [ 2 ]

1 голос
/ 07 января 2011

'0xe84' - шестнадцатеричная строка, которая равна 3716 в десятичной форме.Вы можете преобразовать его в целое число, используя hexdec:

substr($file, $a[2], hexdec($a[1]));

Причина, по которой он работает, когда вы передаете 0xe84 без кавычек, заключается в том, что php правильно интерпретирует шестнадцатеричные литералы.Тем не менее, он не понимает его как шестнадцатеричное число, когда используется как строка '0xe84'.

0 голосов
/ 07 января 2011

Для безопасного кода вы можете использовать функцию intval для получения целочисленного значения:

substr($file, $a[2], intval($a[1],16));

второй параметр intval означает основание, здесь мы используем HEX

С уважением, NiL

...