我试图在浏览器中正常运行的页面上显示电子邮件地址,但在代码中进行模糊处理,希望至少有一些垃圾邮件机器人可以忽略它们。
我有这个测试代码:
<?php
$email = "fake@test.com";
$mailto = "mailto:" . $email;
?>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<p>PHP: <a href="<?php echo htmlentities($mailto); ?>"><?php echo htmlentities($email); ?></a></p>
<p> </p>
<p>MANUAL: <a href="mailto:fake@test.com">fake@test.com</a></p>
</body>
</html>
这两个链接在页面上看起来都很正常,但只有&#39;手册&#39;一个是编码的。
我从php.net获得有关htmlentities如何运作的信息。
http://php.net/manual/en/function.htmlentities.php
文档说明&#34;所有具有HTML字符实体等价物的字符都被翻译成这些实体。&#34;由于字母表中的所有字母都具有等价物,因此我希望每个字母都可以转换。但是在该页面的示例中,它表明基本字母不会被转换。
此外,当我在该页面上查看源代码时,似乎php代码根本不起作用。我的期望是两个链接在代码中显示相同。以下是查看来源&#39;
的结果<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<p>PHP: <a href="mailto:fake@test.com">fake@test.com</a></p>
<p> </p>
<p>MANUAL: <a href="mailto:fake@test.com">fake@test.com</a></p>
</body>
</html>
所以看起来htmlentities()并没有做任何事情。甚至没有编码&#39; @&#39;。
我应该添加一些标志吗? 有一个更好的方法吗? 如果我成功,这甚至会对机器人起作用,还是我在浪费时间?
答案 0 :(得分:2)
误解可能来自http://php.net/manual/en/function.htmlentities.php
此函数与htmlspecialchars()在所有方面都相同,除了htmlentities()之外,所有具有HTML字符实体等价物的字符都会被转换为这些实体。
http://php.net/manual/en/function.htmlspecialchars.php
的真正含义某些字符在HTML中具有特殊意义,如果要保留其含义,则应由HTML实体表示。
htmlspecialchars()
对&
,"
,'
,<
和>
进行编码。检查:
print_r(get_html_translation_table(HTML_SPECIALCHARS));
htmlentities()
对更多字符进行编码,但只有字符 在HTML 中具有特殊意义。检查:
print_r(get_html_translation_table(HTML_ENTITIES));
你可能会看到这样的事情。我在链接中检查了它,它按预期工作:
$result = preg_replace_callback('/./', function($m) {
return '&#'.ord($m[0]).';';
},
'mailto:fake@test.com');
这将用&#
替换字符串中的每个字符,然后替换字符的ASCII值,然后;