Преобразование eregi_replace в preg_replace

Я пытаюсь разобрать некоторые фрагменты HTML и хочу очистить их по разным причинам (XSS и др.).

В настоящее время я пытаюсь удалить все атрибуты любого тега, кроме href на привязке. Я делаю это, используя последовательность вызовов eregi_replace, но я уверен, что есть более разумный способ сделать это, используя preg_replace и всего несколько строк кода, но я не смог заставить его работать. Кто-нибудь может помочь?

Текущий код:

$data_item = eregi_replace("<p[^>]*>","<p>", $data_item);
$data_item = eregi_replace("<h2[^>]*>","<h2>", $data_item);
$data_item = eregi_replace("<h3[^>]*>","<h3>", $data_item);
$data_item = eregi_replace("<h4[^>]*>","<h4>", $data_item);
$data_item = eregi_replace("<h5[^>]*>","<h5>", $data_item);
$data_item = eregi_replace("<h6[^>]*>","<h6>", $data_item);
$data_item = eregi_replace("<ul[^>]*>","<ul>", $data_item);
$data_item = eregi_replace("<ol[^>]*>","<ol>", $data_item);
$data_item = eregi_replace("<li[^>]*>","<li>", $data_item);

$data_item = preg_replace("/<a([^>]*)( href=\S+)([^>]*)>/i", '<a$2 rel="nofollow">', $data_item);

(Мне нужно только проанализировать подмножество тегов HTML, так как до этого я удаляю все нежелательные).

1 ответ

Решение

Почему бы не использовать общее регулярное выражение, которое будет соответствовать любому тегу, а затем preg_replace_callback() чтобы вы могли определить, чем следует заменить данный тег? Таким образом, вы можете иметь простую функцию, которая проверяет, был ли соответствующий тег a тег, и если да, то не заменяйте href, а в противном случае заменяйте все.

В качестве альтернативы, вы можете сделать что-то вроде этого:

$data_item = preg_replace("/<(p|h2|h3|h4|h5|h6|ul|ol)[^>]*>/i","<$1>", $dataitem);

Где () группа в регулярном выражении фиксирует тип совпадающего тега, | является оператором "или" для соответствия любому из указанных тегов, а $1 в тексте замены используется для замены в том, что соответствовало первой (и единственной) группе захвата из шаблона.

Другие вопросы по тегам