Domanda

Sto cercando di analizzare alcuni frammenti HTML e voglio ripulirli per vari motivi (XSS et al).

Attualmente sto provando a rimuovere tutti gli attributi su qualsiasi tag, tranne l'href su un'ancora. Lo sto facendo usando una sequenza di chiamate eregi_replace, ma sono sicuro che esiste un modo più intelligente di farlo usando preg_replace e solo un paio di righe di codice, ma non sono riuscito a farlo funzionare. Qualcuno può aiutare?

Codice attuale:

$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);

(Ho solo bisogno di analizzare un sottoinsieme di tag HTML poiché prima di questo rimuovo tutti gli indesiderabili).

È stato utile?

Soluzione

Perché non usare una regex generale che corrisponderà a qualsiasi tag, quindi preg_replace_callback () per consentirti di determinare con quale dato tag dovrebbe essere sostituito? In questo modo puoi avere una semplice funzione che controlla se il tag abbinato era un un e, in tal caso, non sostituire l'href, ma altrimenti sostituire tutto.

In alternativa, potresti fare qualcosa del genere:

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

Laddove il gruppo () nel regex acquisisce il tipo di tag corrispondente, il | è il " o " operatore per abbinare uno qualsiasi dei tag indicati e il $ 1 nel testo sostitutivo viene utilizzato per sostituire ciò che è stato abbinato dal primo (e unico) gruppo di acquisizione dal modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top