2010-03-06 4 views
5

Вот кусок кода из 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 будет выполнять всю работу только за одну итерацию.

ответ

3

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

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

РЕДАКТИРОВАТЬ: Чтобы быть более конкретным, он пытается сопоставить скобу угла открытия, а затем косой чертой, за которой следует одно из нескольких ключевых слов, за которым следует любое количество символов, которые не являются скобами для угла закрытия и, наконец, , Если ввод следует за синтаксисом, он будет проглочен целиком. Если он неправильный (например, несколько углов открытия и закрытия угла), он будет генерировать мусор, пока он не сможет найти подстроки, соответствующие исходной последовательности.

Итак, нет. Если у вас нет кода <<iframe>iframe>, повторения не требуется. Но тогда вы имеете дело с уровнем суп-тега, регулярное выражение недостаточно для того, чтобы в любом случае (например, оно не получится на < iframe> с дополнительным пространством).

EDIT2: Это также немного странным, что шаблон соответствует ноль или более слэши в начале тега (он должен быть ноль или один). И если мое знание регулярного выражения не слишком ржавое, окончательный *+ тоже не имеет особого смысла (звездочка означает ноль или больше, плюс означает один или несколько, может быть, это жадный синтаксис или что-то подобное?).

2

Что касается абсолютно несвязанного предмета, я хотел бы добавить здесь слово для оптимизации.

preg_replace() может рассказать вам, была ли произведена замена или нет (см. 5-й аргумент, который передается по ссылке). Это намного эффективнее, чем сравнение строк, особенно если они большие.

Смежные вопросы