我正在編寫生成包含通過DOI的文檔鏈接的html代碼的php代碼。鏈接應該指向https://doi.org/
,然後是文檔的DOI。在php中轉義DOI鏈接 - 當esc_url()不夠時
由於結果是一個URL,我想我可以簡單地使用PHP的esc_url()
功能就像
echo '<a href="' . esc_url('https://doi.org/' . $doi)) . '">' . esc_url('https://doi.org/' . $doi)) . '</a>';
,因爲這是一個應該在text nodes, attribute nodes or anywhere else使用。不幸的事情似乎並不容易...
問題是,DOI可以包含各種特殊字符,顯然不被esc_url()
正確處理。這樣的DOI的一個很好的例子是
10.1002/(SICI)1521-3978(199806)46:4/5<493::AID-PROP493>3.0.CO;2-P
這應該鏈接到
https://doi.org/10.1002/(SICI)1521-3978(199806)46:4/5<493::AID-PROP493>3.0.CO;2-P
隨着$doi
等於該DOI然而上面的代碼產生被顯示的鏈接和鏈接到https://doi.org/10.1002/(SICI)1521-3978(199806)46:4/5493::AID-PROP4933.0.CO;2-P
。
這引出了我的問題:如果esc_url()
顯然不是逃避網址的一竅不通的解決方案,那麼我應該使用什麼?對於這種情況下,我能得到我想要與
esc_url(htmlspecialchars('https://doi.org/' . $doi))
的結果,但真的是這樣™做的的正確方法?這有沒有其他不需要的副作用?如果沒有,那麼爲什麼esc_url()
也不能逃脫<
和>
? esc_html()
會比htmlspecialchars()
好嗎?如果是這樣,我應該把它嵌入到esc_url()
?
我知道有很多關於在stackoverflow上使用php轉義url的文章,但我找不到一個能夠解決<
和>
標誌問題的文章。
當你[檢查源代碼](https://core.trac.wordpress.org/browser/tags/4.8/src/wp-includes/formatting.php#L3775)時,你會發現這個函數刪除了字符不匹配正則表達式字符類'[^ a-z0-9-〜+ _。?#=!&;,/:%@ $ \ | * \'()\ [\] \\ x80 - \\ xff]'(將字符如'<' and '>'引入到最終應該成爲HTTP URL一部分的標識符中,我認爲這對於部分DOI人員來說是一個相當傾斜的決定。 ..) – CBroe
我完全同意「dipshit決定」部分:)。 – cgogolin