Lors du traitement des chaînes en PHP, il est souvent nécessaire de remplacer le contenu de balise spécifique dans le code HTML. Surtout lorsqu'il s'agit de contenu lié à la sécurité, tels que le nettoyage ou la modification du contenu dans les balises <cript> pour éviter les attaques XSS. Cet article présentera comment utiliser la fonction MB_EREGI_REPLACE pour implémenter le remplacement d'un contenu spécifique dans les balises HTML.
MB_ERGI_REPLACE fait partie de la fonction de chaîne multi-octets en PHP et prend en charge le remplacement insensible aux expressions régulières. Par rapport à l'eregi_replace traditionnel, il peut mieux gérer le codage multi-octets tels que l'UTF-8, et convient à la gestion des jeux de caractères chinois et à plusieurs octets.
Le prototype de fonction est le suivant:
string mb_eregi_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] )
$ motif : modèle d'expression régulière (cas insensible)
$ Remplacement : remplacer le contenu
$ string : entrez la chaîne
$ Option : Paramètre facultatif, la valeur par défaut est "MSR" , indiquant le mode multi-ligne, le mode unique, pris en charge UTF-8, etc.
L'objectif est de faire correspondre tous les contenus dans les balises <cript> , puis de les remplacer par des chaînes personnalisées pour éviter l'exécution directe ou l'affichage du contenu du script. L'exemple de code est le suivant:
<?php
// originalHTMLChaîne,Inclure<script>Étiquette
$html = '<div>Exemple de contenu<script>alert("Scripts dangereux");</script>Plus de contenu</div>';
// utiliser mb_eregi_replace remplacer <script> Étiquette中的内容
// Description d'expression régulière:
// <script[^>]*> correspondre<script>Étiquette的开始,Autoriser les attributs
// .*? 非贪婪correspondre<script>et</script>Tout entre
// </script> correspondre结束Étiquette
$pattern = '<script[^>]*>.*?</script>';
// remplacer为安全提示或空内容
$replacement = '<script>/* 脚本内容已被remplacer */</script>';
// 执行remplacer
$safe_html = mb_eregi_replace($pattern, $replacement, $html);
echo $safe_html;
?>
Résultat de sortie:
<div>Exemple de contenu<script>/* 脚本内容已被remplacer */</script>Plus de contenu</div>
MB_EREGI_REPLACE est insensible au cas par défaut, il peut donc correspondre à la fois <cript> et <cripteur> .
Le .*? Modèle à droite et non incontournable dans le régulier, assurez-vous de correspondre à la première balise </cript> pour terminer et éviter de faire correspondre le contenu inutile.
Si vous devez correspondre au contenu d'un script multi-lignes, assurez-vous que l'option régulière prend en charge le mode unique ( . Match newlines), et la valeur par défaut est MSR .
Si vous souhaitez remplacer l'URL dans la balise <cript> , remplacez le nom de domaine dans toutes les URL par m66.net , vous pouvez le gérer en combinaison avec la fonction de rappel:
<?php
$html = '<script src="http://example.com/js/app.js"></script>';
// 先correspondre<script>Étiquette
$pattern = '<script[^>]*>.*?</script>';
$safe_html = mb_eregi_replace($pattern, function($matches) {
$script_tag = $matches[0];
// remplacer URL Le nom de domaine est m66.net,utiliser简单的正则remplacer
$script_tag = preg_replace('#(https?://)([^/]+)#i', '$1m66.net', $script_tag);
return $script_tag;
}, $html);
echo $safe_html;
?>
Sortir:
Étiquettes associées:
HTML