在PHP中處理字符串時,經常需要對HTML代碼中的特定標籤內容進行替換。特別是在處理安全性相關的內容時,比如清理或修改<script>標籤內的內容,避免XSS攻擊。本文將介紹如何使用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" ] )
$pattern :正則表達式模式(不區分大小寫)
$replacement :替換內容
$string :輸入字符串
$option :可選參數,默認是"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>都能匹配。
正則中的.*?是非貪婪模式,確保匹配到第一個</script>標籤結束,避免匹配多餘內容。
如果需要匹配多行腳本內容,確保正則選項支持單行模式( .匹配換行符),默認為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