что делает это PHP регулярное выражение? - PullRequest
0 голосов
/ 15 сентября 2009
$str =
preg_replace('#([\x00-\x1F])#e', '"\x" . sprintf("%02x", ord("\1"))', $str);

Ответы [ 2 ]

2 голосов
/ 15 сентября 2009

Он заменяет каждое вхождение символа с порядковым значением от 0 до 31 (в основном это управляющие символы и интервалы, кроме фактического пробела) его числовым значением. Символ e в конце регулярного выражения означает «оценивать шаблон, как если бы он был PHP-кодом», и допускает конкатенацию строк и использование sprintf внутри preg_replace. Регулярное выражение отделяется символом # вместо более распространенного /, без причины в этом случае (обычно это делается, если строка регулярного выражения содержит /, чтобы избежать их выхода).

Например:

<?php
$str = "\t 22 \n ducks";
$str = preg_replace('#([\x00-\x1F])#e', '"\x" . sprintf("%02x", ord("\1"))', $str);
echo $str;
?>

Выходы:

\x09 22 \x0a ducks

Выньте e из шаблона, и вы получите это:

"\x" . sprintf("%02x", ord(" ")) 22 "\x" . sprintf("%02x", ord(" ")) ducks

хотя бы здесь.

1 голос
/ 15 сентября 2009

Обновление:

Я посмотрел на него поближе и похоже, что он конвертирует все символы ascii в диапазоне 1-31 в их шестнадцатеричный эквивалент с префиксом \x.

Мое исходное предположение о реакции кишечника, которое я решил, неверно:

Похоже, это урленкодирование. Я бы, вероятно, вместо этого использовал бы встроенную функцию php urlencode .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...