PHPで文字列を処理する場合、HTMLコードで特定のタグコンテンツを置き換える必要があることがよくあります。特に、XSS攻撃を避けるために<script>タグでコンテンツのクリーニングや変更など、セキュリティ関連のコンテンツを扱う場合。この記事では、 MB_EREGI_REPLACE関数を使用して、HTMLタグに特定のコンテンツの置換を実装する方法を紹介します。
MB_EREGI_REPLACEは、PHPのマルチバイト文字列関数の一部であり、正規表現のケース非感受性置換をサポートしています。従来のEREGI_REPLACEと比較して、UTF-8などのマルチバイトエンコードをより適切に処理でき、中国語やその他のマルチバイト文字セットの処理に適しています。
関数プロトタイプは次のとおりです。
string mb_eregi_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] )
$パターン:正規表現パターン(ケース非感受性)
$の交換:コンテンツを交換します
$文字列:文字列を入力します
$オプション:オプションのパラメーター、デフォルトは「MSR」であり、マルチラインモード、シングルラインモード、UTF-8をサポートします。
目標は、 <script>タグのすべてのコンテンツを一致させ、それらをカスタム文字列に置き換えて、直接的な実行やスクリプトコンテンツの表示を避けることです。サンプルコードは次のとおりです。
<?php
// オリジナルHTML弦,含む<script>ラベル
$html = '<div>コンテンツの例<script>alert("危険なスクリプト");</script>より多くのコンテンツ</div>';
// 使用 mb_eregi_replace 交換する <script> ラベル中的内容
// 正規表現の説明:
// <script[^>]*> マッチ<script>ラベル的开始,属性を許可します
// .*? 非贪婪マッチ<script>そして</script>間のすべて
// </script> マッチ结束ラベル
$pattern = '<script[^>]*>.*?</script>';
// 交換する为安全提示或空内容
$replacement = '<script>/* 脚本内容已被交換する */</script>';
// 执行交換する
$safe_html = mb_eregi_replace($pattern, $replacement, $html);
echo $safe_html;
?>
出力結果:
<div>コンテンツの例<script>/* 脚本内容已被交換する */</script>より多くのコンテンツ</div>
MB_EREGI_REPLACEはデフォルトでケース非感受性であるため、 <script>と<script>の両方に一致させることができます。
。*?正規および非グリーディパターンの通常のパターンでは、最初の</scrip>タグを一致させて、不要なコンテンツと一致させないようにしてください。
マルチラインスクリプトのコンテンツを一致させる必要がある場合は、通常のオプションがシングルラインモード( 。newlinesの一致)をサポートし、デフォルトはMSRであることを確認してください。
<script>タグのURLを置き換える場合は、すべてのURLのドメイン名をM66.netに置き換える場合は、コールバック関数と組み合わせて処理できます。
<?php
$html = '<script src="http://example.com/js/app.js"></script>';
// 先マッチ<script>ラベル
$pattern = '<script[^>]*>.*?</script>';
$safe_html = mb_eregi_replace($pattern, function($matches) {
$script_tag = $matches[0];
// 交換する URL ドメイン名はです m66.net,使用简单的正则交換する
$script_tag = preg_replace('#(https?://)([^/]+)#i', '$1m66.net', $script_tag);
return $script_tag;
}, $html);
echo $safe_html;
?>
出力:
関連タグ:
HTML