Есть проблема. Пользователям дается поле редактирования HTML.
Надо отфильтровать теги (сделано) и в оставшихся разрешенных тегах отфильтровать аттрибуты.
Делаю через DOM.
При этом задание setAttribute пустого значения работает, но в коде получается хлам из пустых аттрибутов, а removeAttribute приводит к тому что не все аттрибуты прорабатываются циклом из-за изменения массива внутри foreach. Как это обойти без дополнительного массива нод и аттрибутов а ля "очереди на удаление"?
PHP код:
if ($node->hasAttributes())
{
$attrs = $node->attributes;
foreach ($attrs as $i => $attr)
{
if (!in_array($attr->name, $allowattrs))
{
$node->setAttribute($attr->name,"");
//$node->removeAttribute($attr->name);
}
}
}
- 13.10.2011 02:11
- 13.10.2011 11:47
- Регистрация: 21.09.2011
- Сообщений: 6
- Репутация: -2
Можно попробовать бежать по аттрибутам не foreach-ем, а while -oм. Увеличивая индекс только если НЕ удаляли.
Т.е. примерно так (пишу с ходу, не помню досконально синтаксис):PHP код:$i=0;
while($i<count($attrs))
{
$attr = $attrs[$i];
if (!in_array($attr->name, $allowattrs))
{
$node->removeAttribute($attr->name);
}
else
{
$i++;
}
}
Спасибо сказали:
MetalMessiah(13.10.2011), - 13.10.2011 12:36
о, подход правильный. что-то я вчера уже тупил и не додумался
только там не count() а $attrs->length
и прочие оле-заморочки
Тэги топика:
Похожие темы
Темы | Раздел | Ответов | Последний пост |
---|---|---|---|
Чистка Твиттера | Дайджест блогосферы | 7 | 04.07.2019 16:05 |
Подбор, парсинг, чистка ключевых слов. Зачем нужно чистить ключевики? | Дорвеи и black SEO | 4 | 15.11.2013 02:14 |
Чистка от возможных вирусов | Прочее | 21 | 31.08.2011 13:54 |