Действительно ли повторение необходимо в следующей части кода?

Вот часть кода из xss_clean метода класса Input_Core платформы Kohana:

do
{
 // Remove really unwanted tags
 $old_data = $data;
 $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
}
while ($old_data !== $data);

Является... необходимым циклом с условием продолжения? Я думал бы, что вызов preg_replace выполнит во всей работе всего одно повторение.

5
задан Emanuil Rusev 6 March 2010 в 22:00
поделиться

2 ответа

Ну, это необходимо, если замена потенциально создает новые совпадения в следующей итерации. Это не очень расточительно, потому что в худшем случае это только дополнительная проверка.

Судя по коду, который он подбирает, кажется маловероятным, что он создаст новые соответствия при замене, однако: он очень строг к тому, что он подбирает.

EDIT: Чтобы быть более конкретным, он пытается найти соответствие открывающей угловой скобке, за которой может следовать слэш, за которым следует одно из нескольких ключевых слов, за которым может следовать любое количество символов, не являющихся закрывающей угловой скобкой, и, наконец, закрывающая угловая скобка. Если входные данные соответствуют этому синтаксису, они будут проглочены целиком. Если он неправильно сформирован (например, много открывающих и закрывающих угловых скобок), он будет генерировать мусор до тех пор, пока не сможет найти подстроки, соответствующие исходной последовательности.

Так что, нет. Если только у вас нет кода вроде <