Essayez ceci complet y flexible solution. Elle fonctionne parfaitement, et est basée en partie par un peu de réponses précédentes, mais contient des contrôles de validation supplémentaires, et se débarrasse de implicite HTML de la loadHTML(...)
fonction. Elle est divisée en deux fonctions distinctes ( un avec une dépendance précédente, donc ne pas réordonner/réorganiser ) afin que vous puissiez l'utiliser avec plusieurs balises HTML que vous souhaitez supprimer simultanément (c'est-à-dire pas seulement 'script'
tags). Par exemple removeAllInstancesOfTag(...)
La fonction accepte un array
de noms de balises, ou optionnellement un seul en tant que string
. Donc, sans plus attendre, voici le code :
/* Remove all instances of a particular HTML tag (e.g. <script>...</script>) from a variable containing raw HTML data. [BEGIN] */
/* Usage Example: $scriptless_html = removeAllInstancesOfTag($html, 'script'); */
if (!function_exists('removeAllInstancesOfTag'))
{
function removeAllInstancesOfTag($html, $tag_nm)
{
if (!empty($html))
{
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'); /* For UTF-8 Compatibility. */
$doc = new DOMDocument();
$doc->loadHTML($html,LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD|LIBXML_NOWARNING);
if (!empty($tag_nm))
{
if (is_array($tag_nm))
{
$tag_nms = $tag_nm;
unset($tag_nm);
foreach ($tag_nms as $tag_nm)
{
$rmvbl_itms = $doc->getElementsByTagName(strval($tag_nm));
$rmvbl_itms_arr = [];
foreach ($rmvbl_itms as $itm)
{
$rmvbl_itms_arr[] = $itm;
};
foreach ($rmvbl_itms_arr as $itm)
{
$itm->parentNode->removeChild($itm);
};
};
}
else if (is_string($tag_nm))
{
$rmvbl_itms = $doc->getElementsByTagName($tag_nm);
$rmvbl_itms_arr = [];
foreach ($rmvbl_itms as $itm)
{
$rmvbl_itms_arr[] = $itm;
};
foreach ($rmvbl_itms_arr as $itm)
{
$itm->parentNode->removeChild($itm);
};
};
};
return $doc->saveHTML();
}
else
{
return '';
};
};
};
/* Remove all instances of a particular HTML tag (e.g. <script>...</script>) from a variable containing raw HTML data. [END] */
/* Remove all instances of dangerous and pesky <script> tags from a variable containing raw user-input HTML data. [BEGIN] */
/* Prerequisites: 'removeAllInstancesOfTag(...)' */
if (!function_exists('removeAllScriptTags'))
{
function removeAllScriptTags($html)
{
return removeAllInstancesOfTag($html, 'script');
};
};
/* Remove all instances of dangerous and pesky <script> tags from a variable containing raw user-input HTML data. [END] */
Et voici un test exemple d'utilisation :
$html = 'This is a JavaScript retention test.<br><br><span id="chk_frst_scrpt">Congratulations! The first \'script\' tag was successfully removed!</span><br><br><span id="chk_secd_scrpt">Congratulations! The second \'script\' tag was successfully removed!</span><script>document.getElementById("chk_frst_scrpt").innerHTML = "Oops! The first \'script\' tag was NOT removed!";</script><script>document.getElementById("chk_secd_scrpt").innerHTML = "Oops! The second \'script\' tag was NOT removed!";</script>';
echo removeAllScriptTags($html);
J'espère que ma réponse aidera vraiment quelqu'un. Bon courage !
3 votes
N'oubliez pas que les balises script ne sont pas les seules parties vulnérables du HTML.
0 votes
Oui, je sais qu'il y a d'autres parties vulnérables aussi, mais j'ai juste besoin d'enlever les balises script.
3 votes
Lire este . Il vous aidera à
4 votes
Jose, non. Lis ça. stackoverflow.com/questions/1732348/ pas de regex pour l'analyse du html
0 votes
Cette question a déjà été posée à plusieurs reprises, par exemple. aquí o aquí mais attention à que .
1 votes
@Rikudo Eh bien... s'il a besoin d'utiliser regexp pour supprimer les balises html... il doit y avoir une raison. Merci pour ce lien !
0 votes
Jose, la raison est que je ne suis pas familier avec d'autres outils plus performants. C'est exactement la même raison pour laquelle les gens utilisent toujours
mysql_*
fonctions en php.0 votes
@Rikudo Sennin -- ou PHP du tout :)
0 votes
@Malvolio nahhh, c'est aller un peu trop loin maintenant :P
0 votes
@Rikudo L'utilisation de regex pour le parsing html a ses propres avantages et inconvénients. Son utilité dépend d'une situation particulière. Ne soyez pas si fanatique. Le monde est beaucoup plus complexe et la même règle ne peut pas être utilisée à toutes fins. Oui, dans de nombreux cas, regex n'est pas le meilleur outil pour l'analyse HTML, mais cela ne veut rien dire.
0 votes
Cependant, dans la plupart des cas, il est très inefficace et peu sûr d'utiliser une regex. Il est très problématique d'utiliser un analyseur syntaxique qui ne comprend pas la langue qu'il analyse. C'est pourquoi il existe spécifique Analyseurs HTML et XML.
0 votes
@Rikudo Vous essayez d'utiliser une seule règle pour tout :) Plus tard, vous verrez que tout n'est pas si simple.
0 votes
En ce qui concerne le débat entre analyseur html et regex - vous avez probablement besoin des deux ; sachez qu'un analyseur html ne reconnaîtra pas les commentaires conditionnels, ce qui signifie qu'IE rendra volontiers les balises script à l'intérieur. Le problème général pour résoudre ce problème de manière élégante est que les navigateurs s'en moquent...