在 PHP 中,HTML 实体编号(如 &
、<
等)与非 ASCII 字符串(如中文、特殊符号等)之间的转换是一个常见的需求。PHP 提供了内置函数来实现这种转换,例如 htmlentities()
、html_entity_decode()
、mb_convert_encoding()
等。
以下是一个实现 HTML 实体编号与非 ASCII 字符串相互转换的 PHP 类实例。
实现功能
将非 ASCII 字符串转换为 HTML 实体编号:
例如:
中文
→中文
。将 HTML 实体编号转换为非 ASCII 字符串:
例如:
中文
→中文
。
类实现
<?phpclass HtmlEntityConverter{ /** * 将非 ASCII 字符串转换为 HTML 实体编号 * * @param string $input 输入字符串 * @return string 转换后的字符串 */ public static function encode($input) { $encoded = ''; $length = mb_strlen($input, 'UTF-8'); for ($i = 0; $i < $length; $i++) { $char = mb_substr($input, $i, 1, 'UTF-8'); if (mb_check_encoding($char, 'ASCII')) { $encoded .= $char; // ASCII 字符直接保留 } else { $encoded .= '&#' . self::unicodeOrd($char) . ';'; // 非 ASCII 字符转换为实体编号 } } return $encoded; } /** * 将 HTML 实体编号转换为非 ASCII 字符串 * * @param string $input 输入字符串 * @return string 转换后的字符串 */ public static function decode($input) { return html_entity_decode($input, ENT_QUOTES, 'UTF-8'); } /** * 获取字符的 Unicode 码点 * * @param string $char 单个字符 * @return int Unicode 码点 */ private static function unicodeOrd($char) { $ord = ord($char[0]); if ($ord < 128) { return $ord; } $bytes = strlen($char); $result = $ord & (0xFF >> ($bytes + 1)); for ($i = 1; $i < $bytes; $i++) { $result = ($result << 6) | (ord($char[$i]) & 0x3F); } return $result; }}// 示例用法$input = '中文测试 & 特殊符号:<>&"';// 编码$encoded = HtmlEntityConverter::encode($input);echo "编码后的字符串: " . $encoded . "\n";// 解码$decoded = HtmlEntityConverter::decode($encoded);echo "解码后的字符串: " . $decoded . "\n";?>
代码说明
encode()
方法:遍历输入字符串的每个字符。
如果是 ASCII 字符,直接保留。
如果是非 ASCII 字符,将其转换为 HTML 实体编号(如
中
)。decode()
方法:使用
html_entity_decode()
函数将 HTML 实体编号转换为原始字符。unicodeOrd()
方法:获取字符的 Unicode 码点,用于生成 HTML 实体编号。
示例输出
编码后的字符串: 中文测试 & 特殊符号:<>&" 解码后的字符串: 中文测试 & 特殊符号:<>&"
支持的功能
支持多字节字符:
使用
mb_*
函数处理多字节字符(如中文、日文等)。保留 ASCII 字符:
ASCII 字符(如字母、数字、标点符号)不会被转换。
支持特殊符号:
特殊符号(如
<
、>
、&
、"
)会被正确编码和解码。
注意事项
字符编码:
确保输入字符串的编码是 UTF-8,否则可能导致转换错误。
性能问题:
对于非常大的字符串,遍历每个字符可能会影响性能。可以考虑优化算法或使用内置函数。
安全性:
在输出到 HTML 页面时,建议使用
htmlspecialchars()
函数防止 XSS 攻击。
扩展功能
如果需要更复杂的功能(如只转换特定字符、支持更多编码等),可以扩展该类。例如:
public static function encodeSpecific($input, $charsToEncode){ $encoded = ''; $length = mb_strlen($input, 'UTF-8'); for ($i = 0; $i < $length; $i++) { $char = mb_substr($input, $i, 1, 'UTF-8'); if (in_array($char, $charsToEncode)) { $encoded .= '&#' . self::unicodeOrd($char) . ';'; } else { $encoded .= $char; } } return $encoded;}
总结
通过以上实现,可以轻松地在 PHP 中实现 HTML 实体编号与非 ASCII 字符串之间的相互转换。根据实际需求,可以进一步扩展和优化代码。
本文关键词: php 实现 HTML 实体 编号 ASCII
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。