在php中转义DOI链接-当esc_url()不够时

在php中转义DOI链接-当esc_url()不够时,php,html,escaping,href,doi,Php,Html,Escaping,Href,Doi,我正在编写php代码,该代码生成html,其中包含通过其链接到文档的链接。链接应指向https://doi.org/后跟文档的DOI 由于结果是一个url,我想我可以简单地使用php的esc\uURL()函数,如 echo '<a href="' . esc_url('https://doi.org/' . $doi)) . '">' . esc_url('https://doi.org/' . $doi)) . '</a>'; 但这真的是正确的方法吗™

我正在编写php代码,该代码生成html,其中包含通过其链接到文档的链接。链接应指向
https://doi.org/
后跟文档的DOI

由于结果是一个url,我想我可以简单地使用php的
esc\uURL()
函数,如

echo '<a href="' . esc_url('https://doi.org/' . $doi)) . '">' . esc_url('https://doi.org/' . $doi)) . '</a>';
但这真的是正确的方法吗™esc_url()也不转义
esc\u html()
会比
htmlspecialchars()
好吗?如果是这样,我是否应该将其嵌套到
esc_url()


我知道在stackoverflow上有很多关于php中转义URL的文章,但我找不到一篇能够解决
符号问题的文章。

我不是php专家,但我知道DOIs和SICIs可能真的很烦人

URL编码和HTML编码是分开的,所以分开考虑它们是有意义的。必须转义尖括号才能生成正确的HTML。至于URL转义,您也应该这样做,因为还有其他可能破坏URL的字符(例如,
字符,它也会不时弹出)

因此,我建议:

'https://doi.org/' . htmlspecialcharacters(urlencode($doi))
这将给你:

<a href="https://doi.org/10.1002%2F%28SICI%291521-3978%28199806%2946%3A4%2F5%3C493%3A%3AAID-PROP493%3E3.0.CO%3B2-P">Click here</a>

请注意函数应用程序的顺序,以及您不想对
https://doi.org
resolver


对上述“愚蠢的决定”的评论。。。这当然不方便。但西西丝在多伊斯之前就已经存在了,这是我们从那以后不得不忍受的烦人的事情之一

我不是PHP专家,但我知道DOIs和SICIs真的很烦人

URL编码和HTML编码是分开的,所以分开考虑它们是有意义的。必须转义尖括号才能生成正确的HTML。至于URL转义,您也应该这样做,因为还有其他可能破坏URL的字符(例如,
字符,它也会不时弹出)

因此,我建议:

'https://doi.org/' . htmlspecialcharacters(urlencode($doi))
这将给你:

<a href="https://doi.org/10.1002%2F%28SICI%291521-3978%28199806%2946%3A4%2F5%3C493%3A%3AAID-PROP493%3E3.0.CO%3B2-P">Click here</a>

请注意函数应用程序的顺序,以及您不想对
https://doi.org
resolver


对上述“愚蠢的决定”的评论。。。这当然不方便。但西西丝在多伊斯之前就已经存在了,这是我们从那以后不得不忍受的烦人的事情之一

当您看到此函数从URL中删除与正则表达式字符类
[^a-z0-9-~++.?\=!&;,/:%@$\\\\\\\\*'()\[\]\\x80-\\xff]不匹配的任何字符。
(将
这样的字符引入到标识符中,这些标识符最终应该成为HTTP URL的一部分,这就是我所说的内政部人员的一个相当愚蠢的决定…)我完全同意“愚蠢的决定”部分:)。当你,您可以看到,此函数将从URL中删除与正则表达式字符类
[^a-z0-9-~+.?\=!&;,/:%@$\\\\\\*'()\[\]\\x80-\\xff]
(将
这样的字符引入到标识符中,这些标识符最终应该成为HTTP URL的一部分,但我会称之为内政部人员的一个相当愚蠢的决定…)我完全同意“愚蠢的决定”部分:)。
urlencode()的论点是什么
over
rawurlencode()
为什么需要
htmlspecialcharacters()
urlencode()
的输出不是只包含字母数字字符和+和-符号吗?哦,看起来
urlencode
生成HTML安全字符,所以
HTMLSpecialCharacters
是不必要的。但是,规范建议您同时执行这两种操作:对于
urlencode
rawurlencode
,从PHP文档来看,唯一的区别似乎是对
~
字符的处理。但是,这两个页面并没有实质性地相互引用。
urlencode()
over
rawurlencode()
的参数是什么?为什么需要
htmlspecialcharacters()
urlencode()
的输出不是只包含字母数字字符和+和-符号吗?哦,看起来
urlencode
生成HTML安全字符,所以
HTMLSpecialCharacters
是不必要的。但是,规范建议您同时执行这两种操作:对于
urlencode
rawurlencode
,从PHP文档来看,唯一的区别似乎是对
~
字符的处理。然而,这两页没有实质性地相互引用。