我试图在浏览器中正常运行的页面上显示电子邮件地址,但在代码中进行了混淆,希望至少可以让一些垃圾邮件机器人忽略它们。
我有这个测试代码:
<?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>
Run Code Online (Sandbox Code Playgroud)
这两个链接在页面上看起来和工作正常,但只有“手动”链接被编码。
我从 php.net 收到了关于 htmlentities 如何工作的相互矛盾的信息。
http://php.net/manual/en/function.htmlentities.php
该文档指出“所有具有 HTML 字符实体等效项的字符都被翻译成这些实体。” 由于字母表中的所有字母都有等价物,我希望每个字符都被转换。但是在该页面上的示例中,它表明基本字母不会被转换。
此外,当我查看该页面上的源代码时,php 代码似乎根本不起作用。我的期望是两个链接在代码中显示相同。这是“查看源代码”的结果。
<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>
Run Code Online (Sandbox Code Playgroud)
所以看起来 htmlentities() 根本没有做任何事情。甚至不编码'@'。
我应该添加一些标志吗?有一个更好的方法吗?如果我成功了,这甚至可以对抗机器人还是我在浪费时间?
误解可能来自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));
Run Code Online (Sandbox Code Playgroud)
htmlentities()编码更多字符,但只编码在 HTML中具有特殊意义的字符。查看:
print_r(get_html_translation_table(HTML_ENTITIES));
Run Code Online (Sandbox Code Playgroud)
你可能会看这样的东西。我在一个链接中检查了它,它按预期工作:
$result = preg_replace_callback('/./', function($m) {
return '&#'.ord($m[0]).';';
},
'mailto:fake@test.com');
Run Code Online (Sandbox Code Playgroud)
这将字符串中的每个字符替换为字符&#的 ASCII 值,然后;
| 归档时间: |
|
| 查看次数: |
628 次 |
| 最近记录: |